天天看點

建立型模式--設計模式詳解?

設計模式 的建立型模式 工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。

建立型模式

簡單工廠模式:

public class SimplePizzaFactory {

    public Pizza createPizza(String pizzaType){
        Pizza pizza = null;
        if(pizzaType.equals("greek")){
            pizza = new GreekPizza();
            return pizza;
        }
        if(pizzaType.equals("cheese")){
            pizza = new CheesePizza();
            return pizza;
        }
        return null;
    }
}      

這樣寫可以看到一個問題:簡單的工廠模式建立類依賴于工程類,如果想要擴充,則必須對工廠類進行修改,違背了開閉原則,是以從設計角度來說,如何解決這個問題?可以定義一個抽象類,并且通過不同的工廠類實作該接口。

public class LDOrderPizza  extends AllPizza {

    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("greek")){
            pizza = new GreekPizza();
            return pizza;
        }
        if(pizzaType.equals("cheese")){
            pizza = new CheesePizza();
            return pizza;
        }
        return null;
    }

}

public class CNOrderPizza extends AllPizza {

    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("greek")){
            pizza = new GreekPizza();
            return pizza;
        }
        if(pizzaType.equals("cheese")){
            pizza = new CheesePizza();
            return pizza;
        }
        return null;
    }
}      

這樣寫的好處是什麼呢,你現在想實作一個功能,隻需要實作一個類就ok了,無需改變已有的代碼,擴充性更好。

工廠方法存在的問題則是使用者需要取LD工廠訂披薩,就必須去LD,想去CN則必須去CN工廠。為了解決這個問題,我們把工廠類抽象為接口。

public class LDOrderPizza  extends AllPizza {

    public LDOrderPizza(String address) {
        super(address);
    }

    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("greek")){
            pizza = new GreekPizza();
            return pizza;
        }
        if(pizzaType.equals("cheese")){
            pizza = new CheesePizza();
            return pizza;
        }
        return null;
    }
}

public interface AbsFactory {
    Pizza createPizza(String pizzaType) ;
}      

這樣寫的好處不需要根據不同的工廠繼續建立對應的工廠類,隻需要傳遞指定的工廠名稱即可。

适用的場景:大量的産品需要建立,并且有共同的接口。

普通工廠模式:隻支援擴充産品。

其中抽象工廠模式,用來生産不同工廠的産品,支援擴充性産品,支援增加産品種類工廠。

單例模式:

分為懶加載和預加載。

懶加載:在使用對象的時候才會加載對象。

預加載:還沒是使用的時候就已經建立好放入記憶體。

很明顯,預加載隻有一條return語句,線程是安全的的,但是缺點是性能的浪費,但是懶加載在兩個線程同時通路的時候,有機會發生線程不安全問題。

public class LanSingleton {
    private static volatile Singleton singleton = null;

    private LanSingleton() {

    }

    private static synchronized Singleton getInstance() {
        if(singleton == null){
            synchronized (Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

}


class Singleton {

}      

上面加了雙重效驗以及volatile,為了防止建立不同的對象,volatile為了保證可見性,因為兩個線程通路的時候,會導緻重排序發生。

生成器模式:

封裝一個複雜對象構造過程,并允許按步奏構造。

優點就是可以将一個對象分解為各個元件,将元件封裝起來,控制整個對象的生成過程。

缺點不同類型的對象要實作不同具體構造器的類,大大增加了類的數量。

與工廠模式不同的是,會按多個步奏來構造對象額,而工廠模式隻有一個步奏。

繼續閱讀