有些情況下,一個對象會有一些重要的性質,在它們沒有恰當的值之前,對象不能作為一個完整的產品使用。比如,一個電子郵件有發件人地址、收件人地址、主題、內容、附錄等部分,而在最起碼的收件人地址未被賦值之前,這個電子郵件不能發出。
有些情況下,一個對象的一些性質必須按照某個順序賦值才有意義。在某個性質沒有賦值之前,另一個性質則無法賦值。這些情況使得性質本身的建造涉及到復雜的商業邏輯。
這時候,此對象相當于一個有待建造的產品,而對象的這些性質相當于產品的零件,建造產品的過程就是組合零件的過程。由于組合零件的過程很復雜,因此,這些"零件"的組合過程往往被"外部化"到一個稱作建造者的對象里,建造者返還給客戶端的是一個全部零件都建造完畢的產品對象。
一,結構
?
?
?
?
?
?
?
?
?
?
?
?
?
?
建造者(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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

