1. 程式人生 > >設計模式之構造型模式

設計模式之構造型模式

生成器 硬盤 數據 服務 表示 比較 控制 擴展性 會有

構造型模式包括了:生成器模式、工廠模式、抽象工廠模式、原型模式和備忘錄模式。

1、生成器模式(Builder Pattern)

也叫建造者模式。使用多個簡單的對象一步一步構建成一個復雜的對象。將一個復雜對象的構建與它的表示分離,使得同樣的構建過程(組裝過程)可以創建不同的表示(最終構成的對象)。

優點: 1、建造者獨立,易擴展。 2、便於控制細節風險。

缺點: 1、產品必須有共同點,範圍有限制。 2、如內部變化復雜,會有很多的建造類。

使用場景: 1、需要生成的對象具有復雜的內部結構。 2、需要生成的對象內部屬性本身相互依賴。

舉個栗子:生產車間裏的工人就是建造者,而生產同一類(構成相同的)產品,比如說電腦,家庭電腦的主要構成基本上是一致的,主板、CPU、電源、硬盤和鼠標鍵盤等,但不同的配置,電腦的性能是不一樣的。生產車間裏就分兩個部門的人,生成不同配置的電腦。

第一步:創建指揮者,主管哪個部門或者哪個人生產哪個配置的產品

技術分享圖片

第二步:創建要生產的產品類

技術分享圖片

第三步:創建抽象生產者類

技術分享圖片

第四步:創建生產者實體類

技術分享圖片

技術分享圖片

最後:指揮生產

技術分享圖片

輸出:

技術分享圖片

2、工廠模式(Factory Pattern)

定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行。在工廠模式中,在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的接口來指向新創建的對象。

優點: 1、一個調用者想創建一個對象,只要知道其名稱就可以了。 2、擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以。 3、屏蔽產品的具體實現,調用者只關心產品的接口。

缺點:每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴。這並不是什麽好事。

使用場景: 1、日誌記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶可以選擇記錄日誌到什麽地方。 2、數據庫訪問,當用戶不知道最後系統采用哪一類數據庫,以及數據庫可能有變化時。 3、設計一個連接服務器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實現一個接口。

註意事項:作為一種創建類模式,在任何需要生成復雜對象的地方,都可以使用工廠方法模式。有一點需要註意的地方就是復雜對象適合使用工廠模式,而簡單對象,特別是只需要通過 new 就可以完成創建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的復雜度。

舉個栗子:一個汙汙的例子,假如有人需要XXOO機器人,他就new一個C罩杯的出來,當然用膩了之後,他想要個D罩杯的,他又要new一個出來。這太麻煩了。如果有一個,他只要告訴工廠,他要什麽樣的就行了。

第一步:創建機器人接口

技術分享圖片

第二步:創建機器人實體類

技術分享圖片

技術分享圖片

第三步:創建工廠類

技術分享圖片

最後:創建工廠類實例,獲取機器人

技術分享圖片

輸出:

技術分享圖片

3、抽象工廠模式(Abstract Factory Pattern)

上面的簡單的工廠類,如果要生產E罩杯的機器人,那麽就創建一個RobotE繼承接口IRobot就行了,但工廠類的switch裏面的判斷要增加一個case “E”的條件。為了改善並擴展工廠模式,就引入了抽象工廠模式。

優點:將對象的創建封裝起來,可以減少客戶端與具體產品類之間的依賴,從而使系統耦合度低,這樣更有利於後期的維護和擴展。

缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的工廠類裏加代碼,又要在具體的裏面加代碼。

使用場景: 1、QQ 換皮膚,一整套一起換。 2、生成不同操作系統的程序。

註意事項:產品族難擴展,產品等級易擴展。

還是舉上面汙汙的例子:改進的地方其實是工廠,將每種機器人的生產落實到不同的工廠裏面去生產

第一步:創建抽象的機器人類

技術分享圖片

第二步:創建機器人實體類

技術分享圖片

技術分享圖片

第三步:創建抽象工廠類

技術分享圖片

第四步:創建工廠的實體類

技術分享圖片

技術分享圖片

最後:創建抽象工廠獲取實體工廠得到對應的機器人

技術分享圖片

輸出:

技術分享圖片

4、原型模式(Prototype Pattern)

用原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。當直接創建對象的代價比較大時,則采用這種模式。例如,一個對象需要在一個高代價的數據庫操作之後被創建。我們可以緩存該對象,在下一個請求時返回它的克隆,在需要的時候更新數據庫,以此來減少數據庫調用。

優點

1、原型模式向客戶隱藏了創建新實例的復雜性
2、原型模式允許動態增加或較少產品類。
3、原型模式簡化了實例的創建結構,工廠方法模式需要有一個與產品類等級結構相同的等級結構,而原型模式不需要這樣。
4、產品類不需要事先確定產品的等級結構,因為原型模式適用於任何的等級結構

缺點

1、每個類必須配備一個克隆方法
2、配備克隆方法需要對類的功能進行通盤考慮,這對於全新的類不是很難,但對於已有的類不一定很容易,特別當一個類引用不支持串行化的間接對象,或者引用含有循環結構的時候。

使用場景

1、資源優化場景。

2、類初始化需要消化非常多的資源,這個資源包括數據、硬件資源等。

3、性能和安全要求的場景。

4、通過 new 產生一個對象需要非常繁瑣的數據準備或訪問權限,則可以使用原型模式。

5、一個對象多個修改者的場景。

6、一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時,可以考慮使用原型模式拷貝多個對象供調用者使用。

7、在實際項目中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法創建一個對象,然後由工廠方法提供給調用者。

舉個栗子:

第一步:創建原型抽象類

技術分享圖片

第二步:創建具體原型實體類

技術分享圖片

最後:實現克隆

技術分享圖片

輸出:

技術分享圖片

5、備忘錄模式(Memento Pattern)

又稱標記(Token)模式。在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可以將該對象恢復到原先保存的狀態(這是備忘錄模式存在的根本原因)。

設計模式之構造型模式