設計模式 的建立型模式 工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。
建立型模式
簡單工廠模式:
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為了保證可見性,因為兩個線程通路的時候,會導緻重排序發生。
生成器模式:
封裝一個複雜對象構造過程,并允許按步奏構造。
優點就是可以将一個對象分解為各個元件,将元件封裝起來,控制整個對象的生成過程。
缺點不同類型的對象要實作不同具體構造器的類,大大增加了類的數量。
與工廠模式不同的是,會按多個步奏來構造對象額,而工廠模式隻有一個步奏。