網站首頁 編程語言 正文
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("門的數量:" + Doors);
Console.WriteLine(Transmission);
Console.WriteLine("配置為:");
foreach (var accessory in Accessories)
{
Console.WriteLine("\t{0}", accessory);
}
}
}
這個Car可以交給Builder1也可以交給Builder2,等等,但首先需要提煉出Builder們的一個抽象類。這個抽象Builder可以設置和獲取Car,并提供生產Car各個部件的抽象方法。
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();
}
然后,就需要一個具體的Builder來派生抽象Builder。
public class BuilderOne : CarBuilder
{
public override void SetEngine()
{
_car.Engine = "發動機1";
}
public override void SetModel()
{
_car.Model = "型號1";
}
public override void SetTransmission()
{
_car.Transmission = "變速1";
}
public override void SetBody()
{
_car.Body = "SUV";
}
public override void SetAccessories()
{
_car.Accessories.Add("內飾");
_car.Accessories.Add("外飾");
}
public override void SetDoors()
{
_car.Doors = 6;
}
}
這個抽象Builder的派生類可能有很多,所以需要一個管理這些派生Builder的類,用來決定到底選用哪個Builder來生產。
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的管理類,通過它的構造函數傳入具體的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模式都可以造車,但兩者有也許的不同:???
- 抽象工廠模式相當于為車找了一個專屬工廠,要求工廠只能造這種類型的車
- Builder模式相當于為車找不同的工廠,不同的工廠生產出來的車型都不一樣
原文鏈接:https://www.cnblogs.com/darrenji/p/4619456.html
相關推薦
- 2023-12-18 Mybatisplus的增刪改查
- 2022-11-28 詳解Rust中的變量與常量_Rust語言
- 2022-04-20 淺談C語言的變量和常量_C 語言
- 2022-04-30 Python自定義指標聚類實例代碼_python
- 2022-05-11 如果解決tomcat端口號被占用
- 2023-03-03 AJAX亂碼與異步同步以及封裝jQuery庫實現步驟詳解_AJAX相關
- 2022-04-21 Android自定義控件實現簡單滑動開關效果_Android
- 2022-04-20 Python設計模式中的結構型適配器模式_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支