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

抽象工廠(Abstract Factory)模式——Java設計模式(三)

抽象工廠模式簡介

抽象工廠模式(Abstract Factory Pattern):圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。

分類:建立型模式。
在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。
意圖:提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

主要解決:主要解決介面選擇的問題。

何時使用:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。

如何解決:在一個產品族裡面,定義多個產品。

角色結構

抽象產品類:各種產品的抽象介面或抽象類;
具體產品類:

抽象產品介面(抽象類)的實現類;
抽象工廠類:核心,定義用於生成抽象產品的介面;
具體工廠類:繼承抽象工廠類,生成一組具體產品(注意是一組,這很重要)。

具體實現

步驟一:建立抽象產品類。
/**
 * 水果類介面
 * @author Administrator
 *
 */
public interface IFruit {
    void printName();
}

/**
 * 蔬類菜介面
 * @author Administrator
 *
 */
public interface IVeggie {
    void printName();
}
步驟二:建立具體產品類。
/**
 * 北方水果。水果類介面的實現類
 * @author Administrator
 *
 */
public class NorthernFruit implements IFruit {
    private String name;

    public NorthernFruit(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void printName() {
        System.out.println(this
.name); } } /** * 南方水果。水果類介面的實現類 * @author Administrator * */ public class SouthernFruit implements IFruit { private String name; public SouthernFruit(String name) { this.name = name; } public String getName() { return name; } @Override public void printName() { System.out.println(this.name); } } /** * 北方蔬菜。蔬菜類介面的實現類 * @author Administrator * */ public class NorthernVeggie implements IVeggie { private String name; public NorthernVeggie(String name) { this.name = name; } public String getName() { return name; } @Override public void printName() { System.out.println(this.name); } } /** * 南方蔬菜。蔬菜類介面的實現類 * @author Administrator * */ public class SouthernVeggie implements IVeggie { private String name; public SouthernVeggie(String name) { this.name = name; } public String getName() { return name; } @Override public void printName() { System.out.println(this.name); } }
步驟三:建立抽象工廠類。
/**
 * 抽象工廠類。有兩個具體的工廠,北方工廠和南方工廠
 * @author Administrator
 *
 */
public interface IAbstractFactory {
    public IFruit createFruit(String name);
    public IVeggie createVeggie(String name);
}
步驟四:建立具體工廠類。
/**
 * 北方工廠。抽象工廠的實現類
 * @author Administrator
 *
 */
public class NorthernFactory implements IAbstractFactory {

    @Override
    public IFruit createFruit(String name) {
        return new NorthernFruit(name);
    }

    @Override
    public IVeggie createVeggie(String name) {
        return new NorthernVeggie(name);
    }
}

/**
 * 南方工廠。抽象工廠的實現類
 * @author Administrator
 *
 */
public class SouthernFactory implements IAbstractFactory {

    @Override
    public IFruit createFruit(String name) {
        return new SouthernFruit(name);
    }

    @Override
    public IVeggie createVeggie(String name) {
        return new SouthernVeggie(name);
    }
}
步驟五:測試。
public class Main {
    public static void main(String[] args) {
        IAbstractFactory northernFactory = new NorthernFactory();
        IFruit fruit1 = northernFactory.createFruit("水果1");
        IVeggie veggie1 = northernFactory.createVeggie("蔬菜1");
        fruit1.printName();
        veggie1.printName();

        IAbstractFactory southernFactory = new SouthernFactory();
        IFruit fruit2 = southernFactory.createFruit("水果2");
        IVeggie veggie2 = southernFactory.createVeggie("蔬菜2");
        fruit2.printName();
        veggie2.printName();
    }
}
步驟六:驗證輸出。
水果1
蔬菜1
水果2
蔬菜2