在本篇文章中,咱們重點介紹建造者模式(Builder Pattern),建造者模式顧名思義,與建造建立相關。事實也是如此建造者模式也是建立型中的一種。在咱們日常生活中會有比較複雜的東西的組成過程。好比電腦組成、手機組成、電視組成、等等。就拿電腦組成來講。能夠由主板、Cpu、顯卡等等組成。可是組成的算法步驟是同樣的。只是不一樣的東西組裝起來結果不同而已。html
在軟件編程的過程咱們是否也會遇到相似電腦組裝這類的問題呢?固然是會的。組裝一個電腦咱們就一次,那豈不是要累死了。相似於這種組裝算法固定可是各個部分又不穩定常常變化的狀況。而且對象組裝較爲複雜。爲了面對解決這種狀況。因此有建造者模式。建造者模式究竟是如何解決問題的呢?咱們一塊兒看看吧。算法
將一個複雜對象的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示。 編程
在建造者模式中通常包含以下成分:設計模式
抽象建造者:抽象建造者爲建立複雜產品對象的各個部分指定抽象建立接口ide
具體建造者:繼承抽象建造者,實現抽象建立接口。指定建立的類型。建立各個具體的部分。ui
產品角色:複雜產品對象,將各個部分組成產品的接口this
指揮者:調用各個部分,按固定的算法建立。不涉及到具體產品類的信息。僅負責各個部分完整的建立spa
就組裝電腦來講,咱們一塊兒看看建造者模式如何實現這一複雜對象的建立設計。設計
namespace Builder_Pattern { public class BuilderPattern { } #region 產品角色——電腦的組成 ============
public class Computer { private string Type = null; public Computer(string type) { this.Type = type; } private List<string> computer = new List<string>(); public void Add(string part) { computer.Add(part); } public void Show() { Console.WriteLine("電腦組裝正式開始:"); foreach (var item in computer) { Console.WriteLine("配件——" + item + "已裝好"); } Console.WriteLine(Type + "電腦組裝完成了"); } } #endregion
#region 抽象建立者——電腦中的各個部分的抽象接口============
public abstract class Builder { /// <summary>
/// Cpu抽象建立 /// </summary>
public abstract void CreateCpu(); /// <summary>
/// 主板抽象建立 /// </summary>
public abstract void CreateMotherboard(); /// <summary>
/// 顯卡抽象建立 /// </summary>
public abstract void CreateGraphicsCard(); /// <summary>
/// 獲取組裝好的電腦 /// </summary>
/// <returns></returns>
public abstract Computer GetComputer(); } #endregion
#region 具體產品建立者——聯想電腦各個部分建立接口=========
public class LenovoBuilder : Builder { Computer lenovo = new Computer("聯想"); public override void CreateCpu() { lenovo.Add("聯想CPU"); } public override void CreateMotherboard() { lenovo.Add("聯想主板"); } public override void CreateGraphicsCard() { lenovo.Add("聯想顯卡"); } public override Computer GetComputer() { return lenovo; } } #endregion
#region 具體產品建立者——惠普電腦各個部分建立接口=========
public class HPBuilder : Builder { Computer hp = new Computer("惠普"); public override void CreateCpu() { hp.Add("惠普CPU"); } public override void CreateMotherboard() { hp.Add("惠普主板"); } public override void CreateGraphicsCard() { hp.Add("惠普顯卡"); } public override Computer GetComputer() { return hp; } } #endregion
#region 指揮者——固定的組裝算法===================
/// <summary>
/// 指揮者,其中的Construct是組裝的較爲固定算法 /// </summary>
public class Commander { public void Construct(Builder builder) { builder.CreateMotherboard(); builder.CreateCpu(); builder.CreateGraphicsCard(); } } #endregion }
class Program { static void Main(string[] args) { //實例化指揮者
Commander commander = new Commander(); //指定具體產品
Builder builder = new LenovoBuilder(); //組裝構建產品
commander.Construct(builder); //構建完成展現產品
Computer computer = builder.GetComputer(); computer.Show(); //指定具體產品
builder = new HPBuilder(); //組裝構建產品
commander.Construct(builder); //構建完成展現產品
computer = builder.GetComputer(); computer.Show(); Console.ReadLine(); } }
在建造者模式中,將一個複雜對象的組成與組件的建立分離開。專門的具體建造者來負責組件的建立、而後由指揮者來規定固定組成、最後完成組裝。這一個過程下來。把複雜對象的建立拆分紅多個步驟。而其組件也是常常變化的。這樣一來組件的變化僅需修改增長組件的建立便可。不影響其餘的擴展。這裏因爲建造者模式最終建立的產品差別較大,因此並無抽象一個產品類。前面一章中講的抽象工廠模式中解決的是」一系列產品對象」的問題。而本章中建造者模式解決的是」產品部分」的問題。抽象工廠模式關心的是總體,注重產品的建立,不關心細節的組成。而建造者模式關心的是細節,注重產品的建立的同時也關係產品組成細節的問題。code
一、當建立一個複雜對象且組成的算法獨立與其組成部分的時候。
二、 多個部件或配件能夠裝配到一個對象但產生的對象不一樣時。
三、建立一些複雜的對象時,這些對象的內部組成構件間的建造順序是穩定的,可是對象的內部組成構件面臨着複雜的變化。
一、使用者客戶端沒必要關心產品的組成及細節部分。
二、具體建造者與其餘類相對獨立,易於擴展。不易對其餘模塊形成影響
三、便於控制細節
一、產品必須有共同點,使用範圍限制
二、若是內部變化較爲複雜,會有較多的具體建造者類
到這裏介紹完了建造者模式,建造者模式與工廠模式相比,建造者模式更像生產的一個複合產品,而且複雜的部件不一樣所構成的不一樣,而工廠模式僅是產品。同時建造者模式關注複雜產品細節的建立。可是工廠模式僅關心產品的建立,不在意其細節的建立。
作本身生命的主角,而不是別人生命中的看客。
歡迎你們掃描下方二維碼,和我一塊兒踏上設計模式的闖關之路吧!