抽象工廠模式(AbstractFactory)

舉例說明:

/**
 * 作者:wanglei
 * 郵箱:229846388@qq.com
 * 抽象工廠模式
 * 工廠類
 */
abstract class Factory {
    /**
     * @return 制造容器
     */
    public abstract Product ManufactureContainer();

    /**
     * @return 制造模具
     */
    public abstract Product ManufactureMould();
}

/**
 * A廠 - 生產模具+容器產品
 */
class FactoryA extends Factory{

    @Override
    public Product ManufactureContainer() {
        return new ContainerProductA();
    }

    @Override
    public Product ManufactureMould() {
        return new MouldProductA();
    }
}

/**
 *B廠 - 生產模具+容器產品
 */
class FactoryB extends Factory{

    @Override
    public Product ManufactureContainer() {
        return new ContainerProductB();
    }

    @Override
    public Product ManufactureMould() {
        return new MouldProductB();
    }
}
/**
 * 作者:wanglei 
 * 郵箱:229846388@qq.com
 * 抽象工廠模式
 * 抽象產品族類
 */
abstract class Product {
    public abstract void show();
}

/**
 * 容器產品抽象類
 */
abstract class ContainerProduct extends Product {
    @Override
    public void show() {

    }
}

/**
 * 模具產品抽象類
 */
abstract class MouldProduct extends Product{
    @Override
    public void show() {

    }
}

/**
 * 容器產品A類
 */
class ContainerProductA extends ContainerProduct{
    @Override
    public void show() {
        System.out.println("生產出了容器產品A");
    }
}

/**
 * 容器產品B類
 */
class ContainerProductB extends ContainerProduct{
    @Override
    public void show() {
        System.out.println("生產出了容器產品B");
    }
}

/**
 * 模具產品A類
 */
class MouldProductA extends MouldProduct{
    @Override
    public void show() {
        System.out.println("生產出了模具產品A");
    }
}

/**
 * 模具產品B類
 */
class MouldProductB extends MouldProduct{
    @Override
    public void show() {
        System.out.println("生產出了模具產品B");
    }
}
/**
 * 作者:wanglei 
 * 郵箱:229846388@qq.com
 * 抽象工廠模式
 * 定義:
 * 1.抽象工廠模式,即Abstract Factory Pattern,提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類;具體的工廠負責實現具體的產品實例。
 * 2.抽象工廠模式與工廠方法模式最大的區別:抽象工廠中每個工廠可以創建多種類的產品;而工廠方法每個工廠只能創建一類
 * 主要作用:
 * 1.允許使用抽象的接口來創建一組相關產品,而不需要知道或關心實際生產出的具體產品是什么,這樣就可以從具體產品中被解耦。
 * 解決的問題:
 * 每個工廠只能創建一類產品,即工廠方法模式的缺點
 * 實例概況:
 * 背景:小成有兩間塑料加工廠(A廠僅生產容器類產品;B廠僅生產模具類產品);隨著客戶需求的變化,A廠所在地的客戶需要也模具類產品,B廠所在地的客戶也需要容器類產品;
 * 沖突:沒有資源(資金+租位)在當地分別開設多一家注塑分廠
 * 解決方案:在原有的兩家塑料廠里增設生產需求的功能,即A廠能生產容器+模具產品;B廠間能生產模具+容器產品。
 */
public class SimpleFactoryPattern {

    public static void main(String[] args) {
        FactoryA factoryA = new FactoryA();
        FactoryB factoryB = new FactoryB();
        //A廠當地客戶需要容器產品A
        factoryA.ManufactureContainer().show();
        //A廠當地客戶需要模具產品A
        factoryA.ManufactureMould().show();
        //B廠當地客戶需要容器產品B
        factoryB.ManufactureContainer().show();
        //B廠當地客戶需要模具產品B
        factoryB.ManufactureMould().show();
    }
}


/**
 * 結果:
 * 生產出了容器產品A
 * 生產出了模具產品A
 * 生產出了容器產品B
 * 生產出了模具產品B
 * 優點:
 * 1.降低耦合:
 * 抽象工廠模式將具體產品的創建延遲到具體工廠的子類中,這樣將對象的創建封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利于后期的維護和擴展;
 * 2.更符合開-閉原則:
 * 新增一種產品類時,只需要增加相應的具體產品類和相應的工廠子類即可::簡單工廠模式需要修改工廠類的判斷邏輯
 * 3.符合單一職責原則:
 * 每個具體工廠類只負責創建對應的產品::簡單工廠中的工廠類存在復雜的switch邏輯判斷
 * 4.不使用靜態工廠方法,可以形成基于繼承的等級結構。::簡單工廠模式的工廠類使用靜態工廠方法
 * 缺點:
 * 1.抽象工廠模式很難支持新種類產品的變化。這是因為抽象工廠接口中已經確定了可以被創建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。
 * 2.對于新的產品族符合開-閉原則;對于新的產品種類不符合開-閉原則,這一特性稱為開-閉原則的傾斜性。
 * 應用場景:
 * 1.一個系統不要求依賴產品類實例如何被創建、組合和表達的表達,這點也是所有工廠模式應用的前提。
 * 2.這個系統有多個系列產品,而系統中只消費其中某一系列產品
 * 3.系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。
 */
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容