Java設計模式(3)——抽象工廠模式
阿新 • • 發佈:2018-02-04
抽象工廠模式 圖片 uml eve 實例 alt pla pub closed
抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產品的具體類型的情況下,能夠創建多個產品族的產品對象。
一、產品族和產品等級結構
為了方便引進抽象工廠模式,特地引進一個新的概念:產品族(Product Family)。所謂產品族,是指位於不同產品等級結構中,功能相關聯的產品組成的家族。每一個產品族中含有產品的數目,與產品等級結構的數目是相等的。產品的等級結構和產品族將產品按照不同方向劃分,形成一個二維的坐標系。即相圖:
在上面的相圖中加入了具體工廠角色。可以看出,對應於每一個產品族都有一個具體的工廠。而每一個工廠負責創建屬於同一個產品族,但是分屬不同的等級機構的產品。
二、模式中包含的角色及其職責
1.抽象工廠(Creator)角色
抽象工廠模式的核心,包含對多個產品結構的聲明,任何工廠類都必須實現這個接口。
2.具體工廠( Concrete Creator)角色
具體工廠類是抽象工廠的一個實現,負責實例化某個產品族中的產品對象。
3.抽象(Product)角色
抽象模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
4.具體產品(Concrete Product)角色
抽象模式所創建的具體實例對象
總結:抽象工廠中方法對應產品結構,具體工廠對應產品族。
三、Demo
抽象角色
產品結構(Apple、Banana)
publicinterface Fruit { /* * 采集 */ public void get(); }
public abstract class Apple implements Fruit{ /* * 采集 */ public abstract void get(); }
public abstract class Banana implements Fruit{ /* * 采集 */ public abstract void get(); }
具體產品角色
產品族(北方水果)
public class NorthApple extends Apple { public void get() { System.out.println("采集北方蘋果"); } }
public class NorthBanana extends Banana { public void get() { System.out.println("采集北方香蕉"); } }
產品族(南方水果)
public class SouthApple extends Apple { public void get() { System.out.println("采集南方蘋果"); } }
public class SouthBanana extends Banana { public void get() { System.out.println("采集南方香蕉"); } }
抽象工廠角色
public interface FruitFactory { //實例化Apple public Fruit getApple(); //實例化Banana public Fruit getBanana(); }
具體工廠角色
public class NorthFruitFactory implements FruitFactory { public Fruit getApple() { return new NorthApple(); } public Fruit getBanana() { return new NorthBanana(); } }
public class SouthFruitFactory implements FruitFactory { public Fruit getApple() { return new SouthApple(); } public Fruit getBanana() { return new SouthBanana(); } }
測試類
public class MainClass { public static void main(String[] args) { FruitFactory ff = new NorthFruitFactory(); Fruit apple = ff.getApple(); apple.get(); Fruit banana = ff.getBanana(); banana.get(); FruitFactory ff2= new SouthFruitFactory(); Fruit apple2 = ff2.getApple(); apple2.get(); Fruit banana2 = ff2.getBanana(); banana2.get(); } }View Code
控制臺輸出
采集北方蘋果
采集北方香蕉
采集南方蘋果
采集南方香蕉
四、UML類圖
Java設計模式(3)——抽象工廠模式