C#設(shè)計模式之建造者模式
場景:我們的冒險家,現(xiàn)在需要去武器商店買一把兵器,有刀和劍兩種武器,冒險者可以告訴武器商人需要哪一種武器,然后武器商人進行鍛造,最后把產(chǎn)品給冒險者,用建造者模式如何實現(xiàn)?
1.什么是建造者模式?
之前寫過簡單工廠、工廠方法以及抽象工廠,這些東西都是創(chuàng)建型設(shè)計模式,同樣建造者模式也是一種創(chuàng)建型的設(shè)計模式,也叫生成器模式。
書上的解釋:將一個復(fù)雜的對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示
四個要素
- Product:一般是一個較為復(fù)雜的對象,也就是說創(chuàng)建對象的過程比較復(fù)雜,一般會有比較多的代碼量。在本類圖中,產(chǎn)品類是一個具體的類,而非抽象類。實際編程中,產(chǎn)品類可以是由一個抽象類與它的不同實現(xiàn)組成,也可以是由多個抽象類與他們的實現(xiàn)組成。
- Builder:引入抽象建造者的目的,是為了將建造的具體過程交與它的子類來實現(xiàn)。這樣更容易擴展。一般至少會有兩個抽象方法,一個用來建造產(chǎn)品,一個是用來返回產(chǎn)品。
- ConcreteBuilder:實現(xiàn)抽象類的所有未實現(xiàn)的方法,具體來說一般是兩項任務(wù):組建產(chǎn)品;返回組建好的產(chǎn)品。
- Director:負責(zé)調(diào)用適當(dāng)?shù)慕ㄔ煺邅斫M建產(chǎn)品,導(dǎo)演類一般不與產(chǎn)品類發(fā)生依賴關(guān)系,與導(dǎo)演類直接交互的是建造者類。一般來說,導(dǎo)演類被用來封裝程序中易變的部分。
2.實現(xiàn)場景
分析場景:
Product就好比是場景中生成的武器(刀和劍)
Builder 就好比武器商人(抽象鍛造方法)
ConcreteBuilder 刀和劍的具體鍛造方式
Director 就是冒險者,指揮武器商人進行產(chǎn)品的鍛造
Weapon.cs
public class Weapon { //定義一個List用來存儲武器的每一個部分 IList<string> parts = new List<string>(); //定義一個方法組裝武器 public void Combine(string part) { parts.Add(part); } //將每一個部分打印出來 public void show() { Console.WriteLine("---------"); foreach (var part in parts) { Console.WriteLine(part); } } }
Builder.cs
public abstract class Builder { //生成武器主體部分 public abstract void CreateMainPart(); //生成武器其他部分 public abstract void CreateOtherPart(); //返回武器 public abstract Weapon ReturnWeapon(); }
KnifeBuilder.cs
public class KnifeBuilder : Builder { private Weapon Knife = new Weapon(); public override void CreateMainPart() { Knife.Combine("添加了刀身"); } public override void CreateOtherPart() { Knife.Combine("添加了刀把"); } public override Weapon ReturnWeapon() { return Knife; } }
SwordBuilder.cs
public class SwordBuilder:Builder { private Weapon Sword = new Weapon(); public override void CreateMainPart() { Sword.Combine("添加了劍身"); } public override void CreateOtherPart() { Sword.Combine("添加了劍柄"); } public override Weapon ReturnWeapon() { return Sword; } }
Adventurer.cs
public class Adventurer { public void Buy(Builder b) { b.CreateMainPart(); b.CreateOtherPart(); } }
客戶端
class Program { static void Main(string[] args) { Adventurer adventurer = new Adventurer(); Builder swordBuilder = new SwordBuilder(); Builder knifeBuilder = new KnifeBuilder(); adventurer.Buy(swordBuilder); Weapon sword = swordBuilder.ReturnWeapon(); sword.show(); adventurer.Buy(knifeBuilder); Weapon knife = knifeBuilder.ReturnWeapon(); knife.show(); Console.ReadLine(); } }
結(jié)果:
到此這篇關(guān)于C#設(shè)計模式之建造者模式的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中const的實現(xiàn)細節(jié)介紹(C,C#同理)
本篇文章主要是對C++中const的實現(xiàn)細節(jié)進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01C# 實現(xiàn)PPT 每一頁轉(zhuǎn)成圖片過程解析
這篇文章主要介紹了C# 實現(xiàn)PPT 每一頁轉(zhuǎn)成圖片過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09.net中前臺javascript與后臺c#函數(shù)相互調(diào)用問題
.net中前臺javascript與后臺c#函數(shù)相互調(diào)用問題...2007-12-12C#使用is、as關(guān)鍵字以及顯式強轉(zhuǎn)實現(xiàn)引用類型轉(zhuǎn)換
這篇文章介紹了C#使用is、as關(guān)鍵字以及顯式強轉(zhuǎn)實現(xiàn)引用類型轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08