建立型模式 - 總結
1、 建立型模式總結
建立型模式顧名思義就是與物件的建立有關的模式。這些模式會返回一個物件給你。建立型模式有簡單工廠、工廠方法、抽象工廠、單例、建造者、原型。
1.1簡單工廠方法
簡單工廠由工廠類、抽象產品類和具體產品類組成。
簡單工廠通過一個靜態方法,根據方法引數以決定返回哪個具體產品。所以又叫靜態工廠。
程式碼是死的,人是活的,這裡通過一個引數去決定返回的具體產品還是太不方便了,每增加一個具體產品就要修改if else 或者 swich。所以可以在工廠類中定義多個靜態方法。每個靜態方法返回一個具體產品。
1.2工廠方法
工廠方法由抽象工廠類、具體工廠類、抽象產品類、具體產品類構成。
在簡單工廠中新增一個具體產品,需要修改工廠類,新增新的靜態方法已返回新的具體產品或者修改if else。
工廠方法通過抽象一個抽象工廠類,使具體產品的建立落到了具體工廠中。工廠方法中有多少個抽象產品就有多少個抽象工廠,抽象產品有多少個具體產品就有多少個具體工廠。
1.3抽象工廠
抽象工廠由抽象工廠類、具體工廠類、抽象產品類、具體產品類構成。組成與工廠方法相同。但在抽象工廠中會有多個工廠方法,每個工廠方法返回一個抽象產品。
當抽象產品之間有一定聯絡形成產品族時,使用工廠方法會導致具體工廠類過多。
例如抽象工廠“電腦”,抽象產品“顯示卡”,抽象產品CPU。抽象“電腦”有兩個具體工廠“低端電腦”和“高階電腦”。顯示卡和CPU都對應有“低端”和“高階”的具體產品。“低端“電腦具體工廠有兩個“工廠方法“,分別返回“低端顯示卡“和“低端CPU“,返回型別為“顯示卡“和“CPU“。同理,“高階電腦“返回“高階顯示卡“和高階“CPU“。
“低端顯示卡“和“低端CPU“組成一個低端的產品族。“高階顯示卡“和“高階CPU“組成高階產品族。抽象工廠這裡就產生了3個介面和6個Java類。使用工廠方法則需要一個抽象“顯示卡“和抽象“CPU“,分別有兩個低端和高階的具體工廠。則工廠方法4個介面和6個Java類。如果產品族中再加個抽象產品“硬碟“,則抽象工廠產生4個介面和8個Java類。工廠方法需要6個介面和8個Java類。
1.4建造者模式
將一個產品的內部表象與產品的生成過程分割開來。從而使一個建造過程生成具有不同的內部表象的產品物件。
建造者模式由抽象建造者類、具體建造者類、導演者類和產品類組成。
抽象建造者類定義了產品類的各個部件的初始化方法。具體建造者類重寫這些方法並完成相關初始化的過程。導演者類負責與客戶端互動。通常導演者類包含與抽象建造者類相同的方法。導演者類持有一個型別為抽象建造者類的屬性,通過構造方法傳入具體的建造者類。導演者類的所有請求實際都是委派給了具體建造者類完成的。
1.4.1多產品建造者模式
多產品建造者模式包含多個產品類。每個產品類對應一個具體建造者類。
1.4.2省略抽象建造者角色
當只有一個具體建造者角色的話,可以省略抽象建造者角色。抽象建造者角色的目的是規範具體建造者角色的行為。當只有一個具體建造者角色的時候,抽象建造者角色就可以去掉了。導演類直接與具體建造者互動。
1.4.3省略導演者角色
導演者類在初始化時會根據傳入的具體建造者角色初始化抽象建造者類屬性。而當抽象建造者角色省去時,只有一個具體的建造者類,此時的導演者類只是一個起到委派作用的轉接類,這個導演者類就可以省略了。
1.5單例模式
單例模式確保某一個類只有一個例項。而且自行例項化並向整個系統提供這個例項。單例模式分為懶漢式和餓漢式。餓漢式由於status機制天生執行緒安全。懶漢式因為延遲載入,初始化在返回物件的方法中。懶漢式可以使用synchronized或者靜態內部類去實現。靜態內部類會比synchronized效率高,不推薦使用雙重鎖校驗的方式實現懶漢式單例。
1.6原型模式
通過給出一個原型物件來指明所要建立的物件的型別,然後用複製這個原型物件的辦法創建出更多的同類型的物件。
1.6.1淺複製
淺複製僅僅複製所考慮的物件,而不是複製它所引用的物件。
物件是在堆中產生的,物件中的類變數的基礎型別的值在這個物件本身的記憶體空間中,引用型別則在這個物件中存放一個引用地址或稱為指標的東西,指向了另一個物件在記憶體中的位置。複製出來的物件中的引用型別變數指向了被複制物件的引用型別變數地址。
1.6.2深複製
深複製是將被複制物件完全拷貝過來。在記憶體中形成一個新的,無任何引用關係的物件。
被複制物件的引用型別物件也會重新再記憶體中建立一個新物件。