C#通過Builder模式造車
Builder模式也可以造車。
對于Builder模式來說,首相要把要造的車確定下來:
public class Car
{
public string Model { get; set; }
public string Engine { get; set; }
public string Transmission { get; set; }
public string Body { get; set; }
public int Doors { get; set; }
public List<string> Accessories { get; set; }
public Car()
{
Accessories = new List<string>();
}
public void ShowCarInfo()
{
Console.WriteLine(Model);
Console.WriteLine(Engine);
Console.WriteLine(Body);
Console.WriteLine("門的數(shù)量:" + Doors);
Console.WriteLine(Transmission);
Console.WriteLine("配置為:");
foreach (var accessory in Accessories)
{
Console.WriteLine("\t{0}", accessory);
}
}
}這個(gè)Car可以交給Builder1也可以交給Builder2,等等,但首先需要提煉出Builder們的一個(gè)抽象類。這個(gè)抽象Builder可以設(shè)置和獲取Car,并提供生產(chǎn)Car各個(gè)部件的抽象方法。
public abstract class CarBuilder
{
protected Car _car;
public Car GetCar()
{
return _car;
}
public void SetCar()
{
_car = new Car();
}
public abstract void SetModel();
public abstract void SetEngine();
public abstract void SetTransmission();
public abstract void SetBody();
public abstract void SetDoors();
public abstract void SetAccessories();
}然后,就需要一個(gè)具體的Builder來派生抽象Builder。
public class BuilderOne : CarBuilder
{
public override void SetEngine()
{
_car.Engine = "發(fā)動(dòng)機(jī)1";
}
public override void SetModel()
{
_car.Model = "型號(hào)1";
}
public override void SetTransmission()
{
_car.Transmission = "變速1";
}
public override void SetBody()
{
_car.Body = "SUV";
}
public override void SetAccessories()
{
_car.Accessories.Add("內(nèi)飾");
_car.Accessories.Add("外飾");
}
public override void SetDoors()
{
_car.Doors = 6;
}
}這個(gè)抽象Builder的派生類可能有很多,所以需要一個(gè)管理這些派生Builder的類,用來決定到底選用哪個(gè)Builder來生產(chǎn)。
public class BuilderManager
{
private readonly CarBuilder _carBuilder;
public BuilderManager(CarBuilder carBuilder)
{
_carBuilder = carBuilder;
}
public void BuildCar()
{
_carBuilder.SetCar();
_carBuilder.SetModel();
_carBuilder.SetEngine();
_carBuilder.SetBody();
_carBuilder.SetDoors();
_carBuilder.SetTransmission();
_carBuilder.SetAccessories();
}
public Car GetCar()
{
return _carBuilder.GetCar();
}
}在客戶端,如果需要造車,就找Builder的管理類,通過它的構(gòu)造函數(shù)傳入具體的Builder。
class Program
{
static void Main(string[] args)
{
var builderManager = new BuilderManager(new BuilderOne());
builderManager.BuildCar();
var car = builderManager.GetCar();
car.ShowCarInfo();
Console.ReadKey();
}
}抽象工廠和Builder模式都可以造車,但兩者有也許的不同:
- 抽象工廠模式相當(dāng)于為車找了一個(gè)專屬工廠,要求工廠只能造這種類型的車
- Builder模式相當(dāng)于為車找不同的工廠,不同的工廠生產(chǎn)出來的車型都不一樣
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- C#設(shè)計(jì)模式之Builder生成器模式解決帶老婆配置電腦問題實(shí)例
- C# StringBuilder和string
- C#中的char、string和StringBuilder的使用詳解
- 淺談C# StringBuilder內(nèi)存碎片對性能的影響
- C#使用String和StringBuilder運(yùn)行速度測試及各自常用方法簡介
- C#中String和StringBuilder的簡介與區(qū)別
- C#中String StringBuilder StringBuffer類的用法
- 淺析C#中StringBuilder類的高效及與String的對比
- 在C#及.NET框架中使用StringBuilder類操作字符串的技巧
- js實(shí)現(xiàn)C#的StringBuilder效果完整實(shí)例
相關(guān)文章
C#百萬數(shù)據(jù)查詢出現(xiàn)超時(shí)問題的解決方法
這篇文章主要介紹了C#百萬數(shù)據(jù)查詢出現(xiàn)超時(shí)問題的解決方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09
解析C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)
這篇文章主要介紹了C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù),是C#入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01
C# 串口接收數(shù)據(jù)中serialPort.close()死鎖的實(shí)例
下面小編就為大家分享一篇C# 串口接收數(shù)據(jù)中serialPort.close()死鎖的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
c# socket網(wǎng)絡(luò)編程接收發(fā)送數(shù)據(jù)示例代碼
這篇文章主要介紹了c# socket網(wǎng)絡(luò)編程,server端接收,client端發(fā)送數(shù)據(jù),大家參考使用吧2013-12-12
C#使用Fody實(shí)現(xiàn)監(jiān)控方法執(zhí)行時(shí)間
這篇文章主要為大家詳細(xì)介紹了C#如何使用Fody實(shí)現(xiàn)監(jiān)控方法執(zhí)行時(shí)間,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-11-11
C#使用Directoryinfo類獲得目錄信息和屬性的方法
這篇文章主要介紹了C#使用Directoryinfo類獲得目錄信息和屬性的方法,涉及C#操作目錄的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
unity3D實(shí)現(xiàn)物體任意角度自旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了unity3D實(shí)現(xiàn)物體任意角度自旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07

