java設計模式-工廠模式

在java中,通常使用new操作符創建對象的實例。但是在一些情況下,new操作符直接生成對象會帶來一些問題,例如:許多類型的實例的創建,可能要求你計算或取得對象的初始設置;選擇生成哪個子對象實例;在對象生成前必須要進行一些輔助對象的生成等。這種情況下,新對象的建立是一個過程,而不是一個操作。
這時候問題就來了:你如何能輕松的構建對象的實例,而不需要去了解和關心構建對象的細節和復雜度呢?
解決方法:建立一個工廠來創建對象。

工廠模式主要為了創建對象提供過渡接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。

一、 分類

工廠模式主要分為如下三類

  • 簡單工廠模式(Simple Factory):不利于產生系列產品
  • 工廠方法模式(Factory Method):多稱為多形性工廠
  • 抽象工廠模式(Abstract Factory):又稱為工具箱,產生產品族,但不利于產生新的產品

這三種模式從上到下逐步抽象,并且更具有一般性。
也有將工廠模式分為兩類:工廠方法模式和抽象工廠模式。將簡單工廠模式看作工廠方法模式的一種特例,兩者歸為一類。

二、 簡單工廠模式(Simple Factory)

簡單工廠模式又稱靜態工廠方法模式。簡單工廠模式存在目的很簡單,就是定義一個用于創建對象的接口。
在簡單工廠模式中,一個工廠類處于對產品類實例化調用的中心位置上,它決定哪一個產品應當被實例化。
它的組成為:

1. 工廠類角色:簡單工廠模式設計的核心,含有一定的商業邏輯和判斷邏輯,在java中它往往由一個具體類來實現。
2. 抽象產品角色:它一般是具體產品集成的父類或者實現的接口,在java中由接口或者抽象類來實現。
3. 具體產品角色:工廠類所能創建的對象就是此角色的實例,java中由一個具體類來實現。
//定義接口類,包含生成商品的方法
public interface IProduct {
    void getProductName();
}
//定義具體商品類,實現創建實際商品的方法
public class ProductA implements IProduct {
    public void getProductName() {
        System.out.println("This is ProductA");
    }
}
public class ProductB implements IProduct {
    public void getProductName() {
        System.out.println("This is ProductB");
    }
}
//定義工廠類,根據條件生成對應的商品
public class ProductFactory {
    public IProduct createProduct(String productType) {
        IProduct product = null;
        if (productType.equals("A")) {
            product = new ProductA();

        } else if (productType.equals("B")) {
            product = new ProductB();

        } else {
        }
        return product;
    }
}
//實際使用,調用工廠類生成商品,然后輸出商品屬性
public class TestProduct {
    public static void main(String[] args) {
        ProductFactory productFactory = new ProductFactory();
        IProduct product = productFactory.createProduct("A");
        product.getProductName();
        product = productFactory.createProduct("B");
        product.getProductName();
    }
}

三、 工廠方法模式

工廠方法模式是簡單工廠模式的進一步抽象化和推廣,工廠方法模式里不再只由一個工廠類決定哪一個產品類應當被實例化。這個決定被交給抽象工廠的子類去做。
來看下它的組成:

   1)抽象工廠角色: 這是工廠方法模式的核心,它與應用程序無關。是具體工廠角色必須實現的接口或者必須繼承的父類。在java中它由抽象類或者接口來實現。
   2)具體工廠角色:它含有和具體業務邏輯有關的代碼。由應用程序調用以創建對應的具體產品的對象。
   3)抽象產品角色:它是具體產品繼承的父類或者是實現的接口。在java中一般由抽象類或者接口來實現。
   4)具體產品角色:具體工廠角色所創建的對象就是此角色的實例。在java中由具體的類來實現。

工廠方法模式使用繼承自抽象工廠角色的多個子類來代替簡單工廠模式中的“上帝類”。正如上面所說,這樣便分擔了對象承受的壓力;而且這樣使得結構變得靈活 起來——當有新的產品產生時,只要按照抽象產品角色、抽象工廠角色提供的合同來生成,那么就可以被客戶使用,而不必去修改任何已有的代碼。可以看出工廠角色的結構也是符合開閉原則的!

//增加工廠接口
public interface IFactory {
    IProduct createProduct();
}
//定義具體工廠類,實現工廠接口。調用實際商品的生成方法
public class ProductFactoryA implements IFactory {
    public IProduct createProduct() {
        IProduct product = new ProductA();
        return product;
    }
}
public class ProductFactoryB implements IFactory {
    public IProduct createProduct() {
        IProduct product = new ProductB();
        return product;
    }
}
//修改調用方法為
public class TestProduct {
    public static void main(String[] args) {
        IFactory factoryA = new ProductFactoryA();
        IProduct productA = factoryA.createProduct();
        productA.getProductName();
        IFactory factoryB = new ProductFactoryA();
        IProduct productB = factoryB.createProduct();
        productB.getProductName();
    }
}

工廠方法形式,在原有每種商品單個接口實現類的基礎上,增加對用的工廠接口實現類,這無疑會增加代碼量,尤其在商品品種增加的情況下。因為如果不能避免這種情 況,可以考慮使用簡單工廠模式與工廠方法模式相結合的方式來減少工廠類:即對于產品樹上類似的種類(一般是樹的葉子中互為兄弟的)使用簡單工廠模式來實現。

四、 簡單工廠和工廠方法模式的比較

工廠方法模式和簡單工廠模式在定義上的不同是很明顯的。工廠方法模式的核心是一個抽象工廠類,而不像簡單工廠模式, 把核心放在一個實類上。工廠方法模式可以允許很多實的工廠類從抽象工廠類繼承下來, 從而可以在實際上成為多個簡單工廠模式的綜合,從而推廣了簡單工廠模式。
反過來講,簡單工廠模式是由工廠方法模式退化而來。設想如果我們非常確定一個系統只需要一個實的工廠類, 那么就不妨把抽象工廠類合并到實的工廠類中去。而這樣一來,我們就退化到簡單工廠模式了。

五、 抽象工廠模式

抽象工廠對應的是產品族的概念,如果有多種產品,則工廠類應該可以創建多種產品的實例。增加新的一類產品線很方便,但是不好增加新的產品到產品族中。
工廠模式中往往是創建一類商品,而抽象工廠中是同時可以創建多種品類商品。

//新增抽象工廠接口類,實現多種類型商品的創建
public interface IAbstractFactory {
    IProductA createProductA();
    IProductB createProductB();
}
//定義抽象工廠的具體實現工廠類,進行實際商品的創建
public class AbFactory implements IAbstractFactory {
    public IProductA createProductA() {
        return new ProductA();
    }

    public IProductB createProductB() {
        return new ProductB();
    }
}
//修改調用方法為
public class TestProduct {
    public static void main(String[] args) {
        IAbstractFactory abstractFactory = new AbFactory();
        IProductA productA = abstractFactory.createProductA();
        productA.getProductName();
        IProductB productB = abstractFactory.createProductB();
        productB.getProductName();
    }
}

六、 總結

(1)簡單工廠模式是由一個具體的類去創建其他類的實例,父類是相同的,父類是具體的。
(2)工廠方法模式是有一個抽象的父類定義公共接口,子類負責生成具體的對象,這樣做的目的是將類的實例化操作延遲到子類中完成。
(3)抽象工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無須指定他們具體的類。它針對的是有多個產品的等級結構。而工廠方法模式針對的是一個產品的等級結構。

參照:
學習:java設計模式—工廠模式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容