1. 程式人生 > >Java設計模式(3)——抽象工廠模式

Java設計模式(3)——抽象工廠模式

抽象工廠模式 圖片 uml eve 實例 alt pla pub closed

  抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產品的具體類型的情況下,能夠創建多個產品族的產品對象。

一、產品族和產品等級結構

  為了方便引進抽象工廠模式,特地引進一個新的概念:產品族(Product Family)。所謂產品族,是指位於不同產品等級結構中,功能相關聯的產品組成的家族。每一個產品族中含有產品的數目,與產品等級結構的數目是相等的。產品的等級結構和產品族將產品按照不同方向劃分,形成一個二維的坐標系。即相圖:

技術分享圖片

  在上面的相圖中加入了具體工廠角色。可以看出,對應於每一個產品族都有一個具體的工廠。而每一個工廠負責創建屬於同一個產品族,但是分屬不同的等級機構的產品。

二、模式中包含的角色及其職責

1.抽象工廠(Creator)角色
  抽象工廠模式的核心,包含對多個產品結構的聲明,任何工廠類都必須實現這個接口。
2.具體工廠( Concrete Creator)角色
  具體工廠類是抽象工廠的一個實現,負責實例化某個產品族中的產品對象。
3.抽象(Product)角色
  抽象模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
4.具體產品(Concrete Product)角色
  抽象模式所創建的具體實例對象
總結:抽象工廠中方法對應產品結構,具體工廠對應產品族。

三、Demo

抽象角色

產品結構(Apple、Banana)

public
interface 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)——抽象工廠模式