問題:
如果我們想寫一個建造人的類,我們可以這樣寫:
class Person
{
public:
void BuildHead();
void BuildBody();
void BuildArmLetf();
void BuildArmRight();
void BuildLegLeft();
void BuildLegRight();
};
但是當我們想建造一個瘦的人,胖的人,高的人,那我們該怎麼辦呢?
我們當然會想到吧把上面的建造人的類定義成一個抽象類別,然後再定義建造瘦人類,胖人類,高人類去依次實現抽象類別的純虛函數。
這樣我們就把建造的對象與它的不同表現分離開了,使得同樣的建造過程可以建立不同的表現。這就是建造者模式的特點。
如果我們用了建造者模式,那麼使用者就只需指定需要建造的類型就可以得到它們,而具體建造的過程和細節就不需要知道了。
建造者模式(產生器模式):
將一個複雜物件的構建於它的表現分離,使得同樣的構建過程可以建立不同的表現。
建造者模式(Builder)結構圖:
總結:
Builder是什麼:是為建立一個Product對象的各子組件的抽象介面
ConcreteBuilder:它是具體建造者,實現Builder介面,構造和裝配各子組件。
Product:那些具體的產品角色
Director:指揮者,它是建造一個使用Builder介面的對象,它主要是用於建立一些複雜的對象,這些對象內部構建間的建造順序通常是穩定的,但對象內部的構建通常面臨著複雜的變化。
建造者模式的好處:
使得建造代碼與表示代碼分離,由於建造者隱藏了該產品是如何組裝的,所以若需要改變一個產品的內部表示,只需要再定義一個具體的建造者就可以了。
建造者模式基本代碼:
class Product
{
public:
void Add(String part); //添加產品組件
};
Builder類-------抽象建造者類,確定產品由兩個部分PartA和PartB組成,並聲明一個得到產品建造後結果的方法:GetResult。
class Builder
{
public:
virtual void BuildPartA()=0;
virtual void BuildPartB()=0;
virtual void GetResult()=0;
};
ConcreteBuilder1類-------具體建造者類
class ConcreteBuilder1 :public Builder
{
private:
Product product = new Product();
public:
void BuildPartA()
{
product.Add(“組件A”);
}
voidBulidPartB()
{
product.Add(“組件B”);
}
void GetResult()
{
return product;
}
};
ConcreteBuilder2類-------具體建造者類
class ConcreteBuilder2 :public Builder
{
private:
Product product = new Product();
public:
void BuildPartA()
{
product.Add(“組件X”);
}
voidBulidPartB()
{
product.Add(“組件Y”);
}
void GetResult()
{
return product;
}
};
Director類--------指揮者類
class Director
{
public:
void Construct(Builder *pbuilder)
{
pbuilder->BuildPartA(); //用來指揮建造過程
pbuilder->BuildPartB();
}
};
用戶端代碼,客戶不需要知道具體的建造過程。
void main()
{
Director director = newDirector();
Builder * b1= new ConcreteBuilder1();
Builder * b2= new ConcreteBuilder2();
director.Construct(b1);
director.Construct(b2);
Product p1 = b1.GetResult(); //指揮者用ConcreteBuilder1的方法來建造產品
Product p2 = b2.GetResult(); //指揮者用ConcreteBuilder2的方法來建造產品
}