建造者模式(生成器模式)

建造者模式

生成器模式一般指本詞條

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

基本介紹

  • 中文名:建造者(生成器)模式
  • 外文名:builder
  • 別名:生成器模式
建造者模式,實用範圍,角色,例子,擴展,

建造者模式

實用範圍

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就是這樣一個例子。

相關詞條

熱門詞條

聯絡我們