建造者模式

將一個複雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的設計模式被稱為建造者模式。

建造者模式

實用範圍

1 當創建複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。

2 當構造過程必須允許被構造的對象有不同表示時。

角色

建造者模式 建造者模式

在這樣的設計模式中,有以下幾個角色:

1 builder:為創建一個產品對象的各個部件指定抽象接口。

2 ConcreteBuilder:實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並 提供一個檢索產品的接口。

3 Director:構造一個使用Builder接口的對象。

4 Product:表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。

例子

Builder

public interface PersonBuilder {

void buildHead();

void buildBody();

void buildFoot();

Person buildPerson();

}

//具體建造工具

ConcreteBuilder

public class ManBuilder implements PersonBuilder {

Person person;

public ManBuilder() {

person = new Person();

}

public void buildbody() {

person.setBody("建造男人的身體");

}

public void buildFoot() {

person.setFoot("建造男人的腳");

}

public void buildHead() {

person.setHead("建造男人的頭");

}

public Person buildPerson() {

return person;

}

}

//建造者

Director

public class PersonDirector {

public Person constructPerson(PersonBuilder pb) {

pb.buildHead();

pb.buildBody();

pb.buildFoot();

return pb.buildPerson();

}

}

Product

public class Person {

private String head;

private String body;

private String foot;

public String getHead() {

return head;

}

public void setHead(String head) {

this.head = head;

}

public String getBody() {

return body;

}

public void setBody(String body) {

this.body = body;

}

public String getFoot() {

return foot;

}

public void setFoot(String foot) {

this.foot = foot;

}

}

public class Man extends Person {

}

Test

public class Test{

public static void main(String[] args) {

PersonDirector pd = new PersonDirector();

Person person = pd.constructPerson(new ManBuilder());

System.out.println(person.getBody());

System.out.println(person.getFoot());

System.out.println(person.getHead());

}

}

result

建造男人的身體

建造男人的腳

建造男人的頭

擴展

建造者模式在使用過程中可以演化出多種形式:

省略抽象建造者角色

如果系統中只需要一個具體的建造者的話,可以省略掉抽象建造者。這是代碼可能如下:

class FoodManager

{

private:

BuilderA * builder;

public:

FoodManager() {builder = new BuilderA();};

void Construct()

{

builder->BuildRiceNoodles();

builder->BuildDrink();

builder->BuildCoolDish();

}

};

省略指導者角色

在具體建造者只有一個的情況下,如果抽象建造者角色已經被省略掉,那么還可以省略掉指導者角色,讓Builder自己扮演指導者和建造者雙重角色。這是代碼可能如下:

//builder

class Builder

{

private:

Food * food;

public:

Builder(){food = new Food();}

void BuildRiceNoodles() {//..};

void BuildCoolDish(){//..};

void BuildDrink(){//..};

Food * getFood(){return food;}

void Construct()

{

BuildRiceNoodles();

BuildCoolDish();

BuildDrink();

}

};

同時,客戶端也需要進行相應的調整,如下:

//client

int _tmain(int argc, _TCHAR* argv[])

{

Builder * builder = new Builder();

builder->Construct();

Food *food = builder->getFood();

food->show();

return 0;

}

C#中的StringBuilder就是這樣一個例子。

相關詞條

熱門詞條

聯絡我們