C#設計模式--建造者模式
阿新 • • 發佈:2019-02-15
設計模式:
建造者模式(Builder Pattern)
簡單介紹:
建造者模式參與者:
- Builder:為建立一個Product物件的各個部件指定抽象介面;
- ConcreteBuilder
° 實現Builder的介面以構造和裝配該產品的各個部件
° 定義並明確它所建立的表示
° 提供一個檢索Product的介面
- Director:構造一個使用Builder介面的物件;
- Product
° 表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程
° 包含定義組成部件的類,包括將這些部件裝配成最終產品的介面
在建造者模式中,Director規定了建立一個物件所需要的步驟和次序,Builder則提供了一些列完成這些步驟的方法,ConcreteBuilder給出了這些方法的具體實現,是物件的直接建立者。
建造者模式類圖:
建造者模式c#程式碼舉例:
Product類 產品類
public class Product { private List<string> _parts = new List<string>(); public void Add(string part) { _parts.Add(part); } public void Show() { Console.WriteLine("Product Parts"); foreach (string part in _parts) { Console.WriteLine(part); } } }
Builder類 抽象介面類
/// <summary>
/// 為建立一個Product物件的各個部件指定抽象介面
/// </summary>
public abstract class Builder
{
public abstract void BuildPart();
public abstract Product GetResult();
}
ConcreteBuilder類 具體建立者類
public class ConcreteBuilder : Builder { private Product _product = new Product(); public override void BuildPart() { _product.Add("Part"); } public override Product GetResult() { return _product; } }
Director類 提供使用Builder類的介面
public class Director
{
/// <summary>
/// 構造一個使用Builder介面的物件
/// </summary>
public void Construct(Builder builder)
{
builder.BuildPart();
}
}
測試程式碼:
class Test
{
static void Main(string[] args)
{
// Create director and builders
Director director = new Director();
Builder b1 = new ConcreteBuilder();
// Construct two products
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
Console.Read();
}
}
執行結果:
例項舉例,手機生產舉例
- Builder-->MobilePhoneBuilder
- ConcreteBuilder-->XiaoMIBuilder和AppleBuilder
- Director-->Factory
- Product -->MobilePhone
分別有:手機品牌(brand),處理器(cup),執行記憶體(ram),外接記憶體(rom)資訊
MobilePhone類產品類
public class MobilePhone
{
private string _brand;
private Dictionary<string, string> _Info = new Dictionary<string, string>();
public string this[string key]
{
get { return _Info[key]; }
set { _Info[key] = value; }
}
public MobilePhone(string brand)
{
this._brand = brand;
}
public void Show()
{
Console.WriteLine("\n-----Info--------");
Console.WriteLine(" BRAND: {0}", _brand);
Console.WriteLine(" CPU : {0}", _Info["cpu"]);
Console.WriteLine(" RAM : {0}", _Info["ram"]);
Console.WriteLine(" ROM : {0}", _Info["rom"]);
}
}
MobilePhoneBuilder類 建立者抽象類
public abstract class MobilePhoneBuilder
{
protected MobilePhone _mobilePhone;
public MobilePhone mobilePhone
{
get { return _mobilePhone; }
}
// Abstract build methods
public abstract void BuildCPU();
public abstract void BuildRAM();
public abstract void BuildROM();
}
XiaoMIBuilder類 小米手機建立者類
public class XiaoMIBuilder:MobilePhoneBuilder
{
public XiaoMIBuilder()
{
_mobilePhone = new MobilePhone("小米5s");
}
public override void BuildCPU()
{
_mobilePhone["cpu"] = "驍龍821";
}
public override void BuildRAM()
{
_mobilePhone["ram"] = "4G";
}
public override void BuildROM()
{
_mobilePhone["rom"] = "32G";
}
}
AppleBuilder類 蘋果手機的具體建立類
public class AppleBuilder:MobilePhoneBuilder
{
public AppleBuilder()
{
_mobilePhone = new MobilePhone("iphone7s plus");
}
public override void BuildCPU()
{
_mobilePhone["cpu"] = "A10";
}
public override void BuildRAM()
{
_mobilePhone["ram"] = "2G";
}
public override void BuildROM()
{
_mobilePhone["rom"] = "128G";
}
}
Factory類,提供建立者的介面
public class Factory
{
public void Construct(MobilePhoneBuilder mobilePhoneBuilder)
{
mobilePhoneBuilder.BuildCPU();
mobilePhoneBuilder.BuildRAM();
mobilePhoneBuilder.BuildROM();
}
}
測試程式碼:
class Test
{
static void Main(string[] args)
{
MobilePhoneBuilder builder;
Factory factory = new Factory();
builder = new XiaoMIBuilder();
factory.Construct(builder);
builder.mobilePhone.Show();
builder = new AppleBuilder();
factory.Construct(builder);
builder.mobilePhone.Show();
Console.Read();
}
}
執行結果: