C#設計模式(5)——建造者模式
阿新 • • 發佈:2018-11-21
1.建造者模式介紹
在軟體開發中,有時我們要建立一個複雜的物件,這個物件由幾個子部件按一定的步驟組合而成,這時候我們就可以使用建造者模式了。說到建造者我們首先想到的是蓋房子,蓋房子簡單的說有三個步驟:打地基,砌磚,粉刷。我們就以蓋房子為例解釋建造者模式的用法。
建造者模式有三個角色:建造者,具體的建造者,監工。理清這三個角色的作用我們就可以愉快的使用建造者模式了。
建造者:一般為抽象類或介面,定義了建造者的功能。如蓋房子例子的建造者有打地基,砌磚和粉刷的功能。
具體的建造者:實現了建造者的抽象方法(或介面)。不同的具體建造者生產的元件不同,如一個技術好的建造者打地基深,砌磚整齊,粉刷光滑,而技術差的建造者打地基淺,砌磚錯亂,粉刷粗糙。
監工:制定建造的演算法。建造者可以打地基,砌磚,粉刷,但是不知道先粉刷還是先打地基,監工就是給建造者制定蓋房子步驟的。
程式碼實現如下,
建造者和具體建造者:
//建造者抽象類,定義了建造者的能力 public abstract class Builder { public abstract void Dadiji();//打地基 public abstract void QiZhuan();//砌磚 public abstract void FenShua();//粉刷 } /// <summary>/// 技術好的建造者 /// </summary> public class GoodBuilder : Builder { private StringBuilder house = new StringBuilder(); public override void Dadiji() { house.Append("深地基-->"); //這裡一般是new一個部件,新增到例項中,如 house.Diji=new Diji("深地基")//為了演示方便 用sringBuilder表示一個複雜的房子,string表示房子的部件 } public override void FenShua() { house.Append("粉刷光滑-->"); } public override void QiZhuan() { house.Append("砌磚整齊-->"); } public string GetHouse() { return house.Append("好質量房子建成了!").ToString(); } } /// <summary> /// 技術差的建造者 /// </summary> public class BadBuilder:Builder { private StringBuilder house = new StringBuilder(); public override void Dadiji() { house.Append("挖淺地基-->"); } public override void FenShua() { house.Append("粉刷粗糙-->"); } public override void QiZhuan() { house.Append("砌磚錯亂-->"); } public string GetHouse() { return house.Append("壞質量房子建成了!").ToString(); } }
監工:
//監工類,制定蓋房子的步驟 public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } //制定蓋房子的流程, public void Construct() { builder.Dadiji();//先打地基 builder.QiZhuan();//再砌磚 builder.FenShua();//最後粉刷 } }
客戶端呼叫:
class Program { static void Main(string[] args) { //監工1派遣技術好的建造者蓋房子 GoodBuilder goodBuilder = new GoodBuilder(); Director director1 = new Director(goodBuilder); director1.Construct(); string house1 = goodBuilder.GetHouse(); Console.WriteLine(house1); //監工2派遣技術差的建造者蓋房子 GoodBuilder badBuilder = new GoodBuilder(); Director director2 = new Director(goodBuilder); director2.Construct(); string house2 = goodBuilder.GetHouse(); Console.WriteLine(house2); Console.ReadKey(); } }
執行結果:
2.小結
上邊例子的類圖
建造者模式的使用場景:
主要解決在軟體系統中,有時候面臨著"一個複雜物件"的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定,這時適合用建造者模式。
建造者模式的優點:
1.例項的構建具體到元件層次,方便控制細節;
2.具體的建造者相互獨立,易於擴充套件。
建造者模式的缺點:
當元件的組合種類很多時,需要建立很多的具體建造者類。