設計模式:
建造者模式(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();
}
}
運行結果: