1. 程式人生 > >《設計模式之禪》-4.工廠方法模式的擴充套件

《設計模式之禪》-4.工廠方法模式的擴充套件

1.靜態工廠模式(簡單工廠模式)

其實就是去掉了抽象工廠類,然後定義一個工廠類的建立方法設定為靜態方法簡化了工廠類的建立

 

public class Factory{
    public static <T extends Product> T create(Class<T> c){
        Product product = null;
        try{
            product = (Product)Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            System.out.print("建立失敗");
        }
        retrun (T) product;
    }
}

通用型和靜態型的場景類程式碼對比 

//通用型工廠模式
public class Client {
    public static void main(String[] args) {
        Creator creator = new Creator();
        Product product = creator.createProduct(ConcteteProduct1.class);
        product.method2();
    }
}

//靜態工廠模式
public class Client {
    public static void main(String[] args) {
        Product product = Factory.createProduct(ConcteteProduct1.class);
        product.method2();
    }
}

只需要直接呼叫靜態方法即可,該模式是工廠模式的弱化,因為變得簡單了,也稱為簡單工廠模式,缺點在於工廠類的擴充套件會比較困難,不符合開閉原則,但在實際專案中使用率還是很高的

 

2.升級為多個工廠類

當在做一個比較複雜的專案時,經常會遇到初始化一個物件很耗費精力的情況,所有的產品類都放在一個工廠方法初始化,有可能會導致程式碼結構不清晰。例如,一個產品類有五個具體實現,每個實現類的初始化都不一樣,如果都使用一個工廠方法,勢必會導致該方法巨大無比,而且結構不清晰。

此時我們可以採取 一個抽象工廠類提供介面,用多個工廠類去實現這個介面,然後通過不同的工廠類去初始化不同的實現類

這樣的好處是在於類的職責清晰,結構簡單。但是給可擴充套件性和維護性帶來了困難,因為每增加一個產品類就要增加一個相應的工廠類。因為工廠類和產品類的數目相同,維護時要考慮兩個物件間的關係。

 

 

3.延遲初始化

public class ProductFactory{
    private static final Map<String,Product> prMap = new HashMap();
    public static synchronized Product createProduct(String type) throws Exception{
        Product product = null;
        if (prMap.containsKey(type){
            priduct = prMap.get(type);
        } else {
            if(type.equals ("xxx")){
                product = new XXX();
            }else {
                product = new xxx2();
            }
            prMap.put(type,product);
        }
            return product;
    }
}