java设计模式(创建型)之生成器模式
第0章:簡介
生成器模式定義:將一個復雜對象的構建與它的表示分離,使得同樣地構建過程可以創建不同的表示。
生成器模式的實質:分離整體構建算法和部件構建
參考:http://chjavach.iteye.com/blog/1617078,研磨設計模式(書籍),大話設計模式(書籍)
模式圖:
待補充
第1章:實踐
第0節:簡單生成器模式
(1)生成器接口(Builder.java)
| package com.mcc.core.designPattern.build.builder.simpleBuilder; /** ?* 生成器接口,這里是對象的構建表示,這里不要求構建過程 ?* ?* 生成器模式的定義:將一個復雜對象的構建與它的表示分離,使得同樣地構建過程可以創建不同的表示。 ?* 生成器模式的表示:分離整體構建算法和部件構建 ?* ?* @author menergy ?*???????? DateTime: 14-3-9? 下午12:54 ?*/ public interface Builder { ??? //構建步驟1 ??? public void buildStep1(); ??? //構建步驟2 ??? public void buildStep2(); ??? //構建步驟3 ??? public void buildStep3(); } |
(2)生成器A類(BuilderImplA.java)
| package com.mcc.core.designPattern.build.builder.simpleBuilder; /** ?* 生成器A ?* ?* @author menergy ?*???????? DateTime: 14-3-9? 下午1:01 ?*/ public class BuilderImplA implements Builder { ??? @Override ??? public void buildStep1() { ??????? System.out.println("生成器A構建步驟1"); ??? } ??? @Override ??? public void buildStep2() { ??????? System.out.println("生成器A構建步驟2"); ??? } ??? @Override ??? public void buildStep3() { ??????? System.out.println("生成器A構建步驟3"); ??? } } |
(3)生成器B類(BuilderImplB.java)
| package com.mcc.core.designPattern.build.builder.simpleBuilder; /** ?* 生成器B ?* ?* @author menergy ?*???????? DateTime: 14-3-9? 下午1:03 ?*/ public class BuilderImplB implements Builder { ??? @Override ??? public void buildStep1() { ??????? System.out.println("生成器B構建步驟1"); ??? } ??? @Override ??? public void buildStep2() { ??????? System.out.println("生成器B構建步驟2"); ??? } ??? @Override ??? public void buildStep3() { ??????? System.out.println("生成器B構建步驟3"); ??? } } |
(4)指導器類(Director.java)
| package com.mcc.core.designPattern.build.builder.simpleBuilder; /** ?* 指導器,指導使用生成器的接口來生成目標產品 ?* ?* @author menergy ?*???????? DateTime: 14-3-9? 下午1:06 ?*/ public class Director { ??? //當前需要使用的生成器對象 ??? private Builder builder; ??? /** ???? * 構造方法,傳入生成器 ???? * @param builder ???? */ ??? public Director(Builder builder){ ??????? this.builder = builder; ??? } ??? /** ???? * 指導生成器構建產品,這里控制構建流程 ???? */ ??? public void build(){ ??????? //構建步驟1 ??????? builder.buildStep1(); ??????? //構建步驟2 ??????? builder.buildStep2(); ??????? //構建步驟3 ??????? builder.buildStep3(); ??? } } |
第1節:復雜生成器模式(不帶約束條件)
(1)復雜對象生成器類(ComplexBuilder.java)
| package com.mcc.core.designPattern.build.builder.unconstraintBuilder; /** ?* 復雜對象生成器,不對屬性加約束條件 ?* ?* @author menergy ?*???????? DateTime: 14-3-9? 下午4:08 ?*/ public class ComplexBuilder { ??? //必須初始屬性 ??? private String property1; ??? private String property2; ??? //非必須初始屬性 ??? private String property3; ??? private String property4; ??? /** ???? * 構造器,傳入必須初始屬性 ???? * @param property1 ???? * @param property2 ???? */ ??? public ComplexBuilder(String property1,String property2){ ??????? this.property1 = property1; ??????? this.property2 = property2; ??? } ??? /** ???? * 設置property3屬性值 ???? * @param property3 ???? * @return ???? */ ??? public ComplexBuilder setProperty3(String property3){ ??????? this.property3 = property3; ??????? return this; ??? } ??? /** ???? * 設置property4屬性值 ???? * @param property4 ???? * @return ???? */ ??? public ComplexBuilder setProperty4(String property4){ ??????? this.property4 = property4; ??????? return this; ??? } ??? /** ???? * 創建真正的對象并返回 ???? * @return ???? */ ??? public ComplexObject build(){ ??????? return new ComplexObject(this); ??? } ??? //提供getter方法供外部訪問,不提供setter方法 ??? public String getProperty1() { ??????? return property1; ??? } ??? public String getProperty2() { ??????? return property2; ??? } ??? public String getProperty3() { ??????? return property3; ??? } ??? public String getProperty4() { ??????? return property4; ??? } } |
(2)復雜對象類(ComplexObject.java)
| package com.mcc.core.designPattern.build.builder.unconstraintBuilder; /** ?* 復雜對象 ?* ?* @author menergy ?*???????? DateTime: 14-3-9? 下午4:00 ?*/ public class ComplexObject { ??? private String property1; ??? private String property2; ??? private String property3; ??? private String property4; ??? /** ???? * 構造器,訪問級別是同包能訪問 ???? * @param builder ???? */ ??? ComplexObject(ComplexBuilder builder){ ??????? this.property1 = builder.getProperty1(); ??????? this.property2 = builder.getProperty2(); ??????? this.property3 = builder.getProperty3(); ??????? this.property4 = builder.getProperty4(); ??? } ??? /** ???? * 其它操作 ???? */ ??? public void someMethod(){ ?????? System.out.println("調用復雜對象的操作方法"); ??? } } |
(3)客戶端測試類(Client.java)
| package com.mcc.core.designPattern.build.builder.unconstraintBuilder; /** ?* 客戶端測試 ?* ?* @author menergy ?*???????? DateTime: 14-3-9? 下午4:23 ?*/ public class Client { ??? public static void main(String args[]){ ??????? //創建生成器 ??????? ComplexBuilder builder = new ComplexBuilder("value1","value2"); ??????? //生成對象,拼接方式設置非必須屬性的值 ??????? ComplexObject complexObject = builder.setProperty3("value3").setProperty4("value4").build(); ??????? //調用對象其它操作 ??????? complexObject.someMethod(); ??? } |
第2節:復雜生成器模式(帶約束條件)
(1)復雜對象(含構建)類(ComplexObject.java)
| package com.mcc.core.designPattern.build.builder.constraintBuilder; /** ?* 復雜對象,融入構建方式,對屬性過濾 ?* ?* @author menergy ?*???????? DateTime: 14-3-9? 下午4:33 ?*/ public class ComplexObject { ??? private String property1; ??? private String property2; ??? private String property3; ??? private String property4; ??? /** ???? * 構造器,訪問級別私有 ???? * @param builder ???? */ ??? private ComplexObject(ComplexBuilder builder){ ??? } ??? /** ???? * 其它操作 ???? */ ??? public void someMethod(){ ??????? System.out.println("調用復雜對象的操作方法"); ??? } ??? /** ???? * 類級內部類,構建對象 ???? */ ??? public static class ComplexBuilder{ ??????? private String property1; ??????? private String property2; ??????? private String property3; ??????? private String property4; ??????? /** ???????? * 構造器,傳入必須初始屬性 ???????? * @param property1 ???????? * @param property2 ???????? */ ??????? public ComplexBuilder(String property1,String property2){ ??????????? this.property1 = property1; ??????????? this.property2 = property2; ??????? } ??????? /** ???????? * 設置property3屬性值 ???????? * @param property3 ???????? * @return ???????? */ ??????? public ComplexBuilder setProperty3(String property3){ ??????????? this.property3 = property3; ??????????? return this; ??????? } ??????? /** ???????? * 設置property4屬性值 ???????? * @param property4 ???????? * @return ???????? */ ??????? public ComplexBuilder setProperty4(String property4){ ??????????? this.property4 = property4; ??????????? return this; ??????? } ??????? /** ???????? * 創建真正的對象并返回 ???????? * @return ???????? */ ??????? public ComplexObject build(){ ??????????? //這里是構建前對屬性的過濾邏輯,這里不做過濾 ??????????? //返回構建的復雜對象 ??????????? return new ComplexObject(this); ??????? } ??? } } |
(2)客戶端測試類(Client.java)
| package com.mcc.core.designPattern.build.builder.constraintBuilder; /** ?* 客戶端測試類 ?* ?* @author menergy ?*???????? DateTime: 14-3-9? 下午4:42 ?*/ public class Client { ??? public static void main(String args[]){ ??????? //創建構建器 ??????? ComplexObject.ComplexBuilder builder = new ComplexObject.ComplexBuilder("value1","value2"); ??????? //構建對象 ??????? ComplexObject complexObject = builder.setProperty3("value3").setProperty4("value4").build(); ??????? //調用復雜對象方法 ??????? complexObject.someMethod(); ??? } } |
思考:
Builder模式主要是為了將構建復雜對象的過程和它的部件解耦。使得我們不用去關心每個部件是如何組裝的。
當我們需要生成一個相對復雜的對象,這個復雜的對象生成過程的內部屬性有一定的順序邏輯或者某種組合邏輯,但對于客戶端(使用者)來說,不需要關注生成的細節和順序,只要可以提供構建好的對象就可以, 或者業務上需要對客戶端屏蔽這種細節和順序,這時我們可以使用生成器模式(建造者模式)來生成這個相對復雜的對象給客戶端,具體細節和順序交給生成器來處理。
例如使用者需要一共特定車型的實例,生成器負責內部完成組裝的細節和順序,最終把組裝好的車型實例交給客戶端(使用者)即可。
一般適用場景是,要生成一個相對復雜的對象,這個對象的實現過程遵循某種細節和順序,客戶端不關注這種細節和順序,或者這種細節和順序需要對客戶端屏蔽。
---------------------------------------------------------------------------------------------------------------------------------
再思考:
Builder模式的主要效果:
1 ) 它使你可以改變一個產品的內部表示 Builder對象提供給導向器一個構造產品的抽象接口。該接口使得生成器可以隱藏這個產品的表示和內部結構。它同時也隱藏了該產品是如何裝配的。因為產品是通過抽象接口構造的,你在改變該產品的內部表示時所要做的只是定義一個新的生成器。
建造者模式很容易進行擴展。如果有新的需求,通過實現一個新的建造者類就可以完成,基本上不用修改之前已經測試通過的代碼,因此也就不會對原有功能引入風險。
2) 它將構造代碼和表示代碼分開 Builder模式通過封裝一個復雜對象的創建和表示方式提高了對象的模塊性。客戶不需要知道定義產品內部結構的類的所有信息;這些類是不出現在Builder接口中的。每個Concrete Builder包含了創建和裝配一個特定產品的所有代碼。這些代碼只需要寫一次;然后不同的Director可以復用它以在相同部件集合的基礎上構作不同的Product。
3 ) 它使你可對構造過程進行更精細的控制 Builder模式與一下子就生成產品的創建型模式不同,它是在導向者的控制下一步一步構造產品的。僅當該產品完成時導向者才從生成器中取回它。因此Builder接口相比其他創建型模式能更好的反映產品的構造過程。這使你可以更精細的控制構建過程,從而能更精細的控制所得產品的內部結構。
總結
以上是生活随笔為你收集整理的java设计模式(创建型)之生成器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用dom4j把XML文件解析成Java
- 下一篇: Ext4及F2FS文件系统 Debug