簡介:
抽象工廠模式解決了“多系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。更適用於產品內部的劇烈變化但是實現產品的最終順序一致。StringBuilder類,它就是一個建造者模式的實現。建造者模式有四個角色:建造者,具體的建造者,指導者,產品角色。
優點 |
1.可以使客戶端不必知道產品內部組成的細節。 2.具體的建造者類之間是相互獨立的,容易擴展。 3.由於具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模塊產生任何影響。 |
缺點 | 大量新增產品時會產生多餘的Build對象以及Director類。 |
特點 |
1.不同Builder的相同的方法,內部實現不一樣,產生不同的事件結果時。 2.對於Director,這些對象的內部組成構件間的建造順序是穩定的,但是對象的內部組成構件面臨着複雜的變化。 |
抽象建造者角色(Builder) | 爲創建一個Product對象的各個部件指定抽象接口,以規範產品對象的各個組成部分的建造。一般而言,此角色規定要實現複雜對象的哪些部件的創建,並不涉及具體的對象部件的創建。 |
具體建造者(ConcreteBuilder) |
1.繼承Builder類,即實現抽象建造者角色Builder的方法。 2.具體化組件以實現方法的創建。 3.返回產品角色的實例。 |
指導者(Director) | 調用具體建造者角色以創建產品對象的各個部分。指導者並沒有涉及具體產品類的信息,真正擁有具體產品的信息是具體建造者。 |
產品角色(Product) | 建造中的複雜對象。它要包含那些定義組件的類,包括將這些組件裝配成產品的接口。 |
使用:
//指導者類
public class Director
{
public void Construct(IBuilder builder)
{
builder.GetDraw();
builder.GetPrint();
}
}
//產品類
public sealed class Shape
{
//組件
private List<string> parts = new List<string>();
public void Prepare(string part)
{
parts.Add(part);
}
public void Finish()
{
foreach (string str in parts)
{
//do something
}
}
}
//建造者抽象類
public abstract class IBuilder
{
public abstract void GetDraw();
public abstract void GetPrint();
public abstract Shape GetShape();
}
//繼承建造者類 ==》 具體建造者
public class SquareBuilder : IBuilder
{
Shape shape = new Shape();
public override void GetDraw()
{
shape.Prepare("Pen");
shape.Prepare("Ruler");
}
public override void GetPrint()
{
shape.Prepare("Paper");
}
public override Shape GetShape()
{
return shape;
}
}
//繼承建造者類 ==》 具體建造者
public class CircleBuilder : IBuilder
{
Shape shape = new Shape();
public override void GetDraw()
{
shape.Prepare("Pen");
shape.Prepare("Dividers");
}
public override void GetPrint()
{
shape.Prepare("Paper");
}
public override Shape GetShape()
{
return shape;
}
}
//建造者模式調用
Director director = new Director(); //實例指導者
IBuilder builderSquare = new SquareBuilder(); //實例建造者
director.Construct(builderSquare); //實現具體建造者的內部操作
Shape shapeSquare = builderSquare.GetShape(); //獲取一個建造後的產品類
shapeSquare.Finish(); //完成一個產品的創建
IBuilder builderCircle = new CircleBuilder();
director.Construct(builderCircle);
Shape shapeCircle = builderCircle.GetShape();
shapeCircle.Finish();