學習了設計模式,一直感覺有進步又沒有進步,與同學、同事探討了一下。變化不可能一會就可以的,需要努力堅持。不管進步大小,也不管是否進步,做到勿忘初心,做自己喜歡的事情就好。還有幾個設計模式一直沒有寫,原因之一是上面所說的,原因之二是覺的理解不夠,不知道如何下筆。
建造者模式
建造者模式,顧名思義的就是類似建房子,有一個固定的流程。在大話設計模式中,作者舉了一個例子大概意思是同一道菜在中國的每一個地方都有不同的味道(LZ印象最深的是魚香肉絲,來北方最之后印象最深的是宮保雞丁。哈哈),而肯德基的雞腿、漢堡在每一個城市都是一樣的味道。我覺的這一個例子可以清楚的認識到建造者模式有一個固定的建造過程。建造者模式實現了依賴倒轉原則,抽象不應該依賴細節,細節應該依賴與抽象。建造者模式的定義是:將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的設計模式被稱為建造者模式。
建造者模式的角色定義,在建造者模式中存在以下4個角色:
1 builder:為創建一個產品對象的各個部件指定抽象接口。
2 ConcreteBuilder:實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並提供一個檢索產品的接口。
3 Director:構造一個使用Builder接口的對象。
4 Product:表示被構造的復雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。
建造者模式UML圖
從上圖可以看出Builder是為創建一個Product對象的各個部件指定的抽象接口,Prodcut是具體的產品。Director是一個建造者,由它指揮使用BUilder。ConcreteBuilder是具體的建造,實現Builder接口的各個方法。
建造者模式代碼
建造者模式我們就以建房子這一個工程為例子寫程序吧。這一過程為打樁建立基礎、砌牆、封頂。不管是普通房子也好,別墅也好都需要經歷這一過程,符合我們的建設
具體的產品Product
package com.roc.build; /** * 具體的產品---房子 * @author liaowp * */ public class Product { private String basic;//地基 private String wall;//牆 private String roofed;//樓頂 public String getBasic() { return basic; } public void setBasic(String basic) { this.basic = basic; } public String getWall() { return wall; } public void setWall(String wall) { this.wall = wall; } public String getRoofed() { return roofed; } public void setRoofed(String roofed) { this.roofed = roofed; } }
抽象建造
package com.roc.build; /** * 抽象建造 * @author liaowp * */ public interface Builder { /** * 打基礎 */ public void buildBasic(); /** * 砌牆 */ public void buildWalls(); /** * 封頂 */ public void roofed(); /** * 造房子 * @return */ public Product buildProduct(); }
具體的建造
package com.roc.build; /** * 具體的建造 * @author liaowp * */ public class ConcreteBuilder implements Builder{ private Product product; public ConcreteBuilder(){ product=new Product(); } @Override public void buildBasic() { product.setBasic("打好基礎"); } @Override public void buildWalls() { product.setWall("砌牆"); } @Override public void roofed() { product.setRoofed("封頂大吉"); } @Override public Product buildProduct() { return product; } }
建造者
package com.roc.build; /** * 建造者 * @author liaowp * */ public class Director { public Product constructProduct(ConcreteBuilder concreteBuilder){ concreteBuilder.buildBasic(); concreteBuilder.buildWalls(); concreteBuilder.roofed(); return concreteBuilder.buildProduct(); } }
測試類
package com.roc.build; /** * 建造者 * @author liaowp * */ public class Director { public Product constructProduct(ConcreteBuilder concreteBuilder){ concreteBuilder.buildBasic(); concreteBuilder.buildWalls(); concreteBuilder.roofed(); return concreteBuilder.buildProduct(); } }
建造者模式適用場景
建造者模式是在當創建復雜對象的復雜算法一個獨立與該對象的組成部分以及它們的裝配方式時適用的模式。