有些情況下,一個對象會有一些重要的性質,在它們沒有恰當的值之前,對象不能作為一個完整的產品使用。比如,一個電子郵件有發件人地址、收件人地址、主題、內容、附錄等部分,而在最起碼的收件人地址未被賦值之前,這個電子郵件不能發出。
有些情況下,一個對象的一些性質必須按照某個順序賦值才有意義。在某個性質沒有賦值之前,另一個性質則無法賦值。這些情況使得性質本身的建造涉及到復雜的商業邏輯。
這時候,此對象相當于一個有待建造的產品,而對象的這些性質相當于產品的零件,建造產品的過程就是組合零件的過程。由于組合零件的過程很復雜,因此,這些"零件"的組合過程往往被"外部化"到一個稱作建造者的對象里,建造者返還給客戶端的是一個全部零件都建造完畢的產品對象。
一,結構
?
?
?
?
?
?
?
?
?
?
?
?
?
?
建造者(Builder)角色: 給出一個抽象接口,以規范產品對象的各個組成成分的建造。一般而言,此接口獨立于應用程序的商業邏輯。模式中直接創建產品對象的是具體建造者(ConcreteBuilder)角色。具體建造者類必須實現這個接口所要求的方法:一個是建造方法,另一個是結果返還方法。
具體建造者(Concrete Builder)角色: 擔任這個角色的是于應用程序緊密相關的類,它們在應用程序調用下創建產品實例。這個角色主要完成的任務包括:
實現Builder角色提供的接口,一步一步完成創建產品實例的過程。
在建造過程完成后,提供產品的實例。
指導者(Director)角色: 擔任這個角色的類調用具體建造者角色以創建產品對象。導演者并沒有產品類的具體知識,真正擁有產品類的具體知識的是具體建造者對象。
產品(Product)角色: 產品便是建造中的復雜對象。
指導者角色是于客戶端打交道的角色。導演者角色將客戶端創建產品的請求劃分為對各個零件的建造請求,再將這些請求委派給具體建造者角色。具體建造者角色是做具體建造工作的,但卻不為客戶端所知。
二,示例代碼
import java.util.ArrayList; /** * 指導者 * @author Salmon * */ public class Director { public void construct( Builder builder ) { builder.buildPartA(); builder.buildPartB(); } } /** * 建造者 * @author Salmon * */ public interface Builder { public void buildPartA(); public void buildPartB(); public Product getResult(); } /** * 具體建造者 * @author Salmon * */ public class ConcreteBuilder1 implements Builder { private Product product; public void buildPartA() { product = new Product(); product.add( "PartA" ); } public void buildPartB() { product.add( "PartB" ); } public Product getResult() { return product; } } /** * 具體建造者 * @author Salmon * */ public class ConcreteBuilder2 implements Builder { private Product product; public void buildPartA(){ product = new Product(); product.add( "PartX" ); } public void buildPartB() { product.add( "PartY" ); } public Product getResult() { return product; } } /** * 產品 * @author Salmon * */ public class Product { ArrayList<String> parts = new ArrayList<String>(); public void add( String part ) { parts.add( part ); } public void show() { System.out.println( " Product Parts -------" ); for(String part : parts) System.out.println( part ); } } /** * 客戶端代碼 * @author Salmon * */ public class Client { public static void main( String[] args ) { // Create director and builders Director director = new Director( ); Builder b1 = new ConcreteBuilder1(); Builder b2 = new ConcreteBuilder2(); // Construct two products director.construct( b1 ); Product p1 = b1.getResult(); p1.show(); director.construct( b2 ); Product p2 = b2.getResult(); p2.show(); } }
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
