前言
在本篇文章中,我們重點(diǎn)介紹建造者模式(Builder Pattern),
建造者模式顧名思義,與建造創(chuàng)建相關(guān)。事實(shí)也是如此建造者模式也是創(chuàng)建型中的一種。在我們平常生活中會有比較復(fù)雜的東西的組成過程。比如電腦組成、手機(jī)組成、電視組成、等等。就拿電腦組成來說。可以由主板、Cpu、顯卡等等組成。但是組成的算法步驟是一樣的。只是不同的東西組裝起來結(jié)果不一樣而已。
建造者模式介紹
一、來由
在軟件編程的過程我們是否也會遇到類似電腦組裝這類的問題呢?當(dāng)然是會的。組裝一個(gè)電腦我們就一次,那豈不是要累死了。類似于這種組裝算法固定但是各個(gè)部分又不穩(wěn)定經(jīng)常變化的情況。并且對象組裝較為復(fù)雜。為了面對解決這種情況。所以有建造者模式。建造者模式到底是如何解決問題的呢?我們一起看看吧。
二、意圖
將一個(gè)復(fù)雜對象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。????
三、案例圖 ?
?
四、建造者模式代碼示例
在建造者模式中一般包含如下成分:
抽象建造者:抽象建造者為創(chuàng)建復(fù)雜產(chǎn)品對象的各個(gè)部分指定抽象創(chuàng)建接口
具體建造者:繼承抽象建造者,實(shí)現(xiàn)抽象創(chuàng)建接口。指定創(chuàng)建的類型。創(chuàng)建各個(gè)具體的部分。
產(chǎn)品角色:復(fù)雜產(chǎn)品對象,將各個(gè)部分組成產(chǎn)品的接口
指揮者:調(diào)用各個(gè)部分,按固定的算法創(chuàng)建。不涉及到具體產(chǎn)品類的信息。僅負(fù)責(zé)各個(gè)部分完整的創(chuàng)建
?
就組裝電腦來說,我們一起看看建造者模式如何實(shí)現(xiàn)這一復(fù)雜對象的創(chuàng)建設(shè)計(jì)。
namespace Builder_Pattern { public class BuilderPattern { } #region
產(chǎn)品角色——電腦的組成 ============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
抽象創(chuàng)建者——電腦中的各個(gè)部分的抽象接口============public abstract class Builder { /// <summary>
/// Cpu抽象創(chuàng)建 /// </summary> public abstract void CreateCpu(); /// <summary> ///
主板抽象創(chuàng)建/// </summary> public abstract void CreateMotherboard(); /// <summary> ///
顯卡抽象創(chuàng)建/// </summary> public abstract void CreateGraphicsCard(); /// <summary>
/// 獲取組裝好的電腦 /// </summary> /// <returns></returns> public abstract Computer
GetComputer(); }#endregion #region 具體產(chǎn)品創(chuàng)建者——聯(lián)想電腦各個(gè)部分創(chuàng)建接口========= public class
LenovoBuilder : Builder { Computer lenovo= new Computer("聯(lián)想"); public override
void CreateCpu() { lenovo.Add("聯(lián)想CPU"); } public override void
CreateMotherboard() { lenovo.Add("聯(lián)想主板"); } public override void
CreateGraphicsCard() { lenovo.Add("聯(lián)想顯卡"); } public override Computer
GetComputer() {return lenovo; } } #endregion #region
具體產(chǎn)品創(chuàng)建者——惠普電腦各個(gè)部分創(chuàng)建接口=========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) { //實(shí)例化指揮者 Commander commander = new
Commander();//指定具體產(chǎn)品 Builder builder = new LenovoBuilder(); //組裝構(gòu)建產(chǎn)品
commander.Construct(builder);//構(gòu)建完成展示產(chǎn)品 Computer computer =
builder.GetComputer(); computer.Show();//指定具體產(chǎn)品 builder = new HPBuilder(); //
組裝構(gòu)建產(chǎn)品 commander.Construct(builder); //構(gòu)建完成展示產(chǎn)品 computer =
builder.GetComputer(); computer.Show(); Console.ReadLine(); } }
?
使用場景及優(yōu)缺點(diǎn)
在建造者模式中,將一個(gè)復(fù)雜對象的組成與組件的創(chuàng)建分離開。專門的具體建造者來負(fù)責(zé)組件的創(chuàng)建、然后由指揮者來規(guī)定固定組成、最后完成組裝。這一個(gè)過程下來。把復(fù)雜對象的創(chuàng)建拆分成多個(gè)步驟。而其組件也是經(jīng)常變化的。這樣一來組件的變化僅需修改增加組件的創(chuàng)建即可。不影響其他的擴(kuò)展。這里由于建造者模式最終創(chuàng)建的產(chǎn)品差異較大,所以并沒有抽象一個(gè)產(chǎn)品類。前面一章中講的抽象工廠模式中解決的是”一系列產(chǎn)品對象”的問題。而本章中建造者模式解決的是”產(chǎn)品部分”的問題。抽象工廠模式關(guān)心的是整體,注重產(chǎn)品的創(chuàng)建,不關(guān)心細(xì)節(jié)的組成。而建造者模式關(guān)心的是細(xì)節(jié),注重產(chǎn)品的創(chuàng)建的同時(shí)也關(guān)系產(chǎn)品組成細(xì)節(jié)的問題。
一、使用場景
1、當(dāng)創(chuàng)建一個(gè)復(fù)雜對象且組成的算法獨(dú)立與其組成部分的時(shí)候。
2、?多個(gè)部件或配件可以裝配到一個(gè)對象但產(chǎn)生的對象不同時(shí)。
3、創(chuàng)建一些復(fù)雜的對象時(shí),這些對象的內(nèi)部組成構(gòu)件間的建造順序是穩(wěn)定的,但是對象的內(nèi)部組成構(gòu)件面臨著復(fù)雜的變化。
二、優(yōu)點(diǎn)
1、使用者客戶端不必關(guān)心產(chǎn)品的組成及細(xì)節(jié)部分。
2、具體建造者與其他類相對獨(dú)立,易于擴(kuò)展。不易對其他模塊造成影響
3、便于控制細(xì)節(jié)
三、缺點(diǎn)
1、產(chǎn)品必須有共同點(diǎn),使用范圍限制
2、如果內(nèi)部變化較為復(fù)雜,會有較多的具體建造者類
總結(jié)
到這里介紹完了建造者模式,建造者模式與工廠模式相比,建造者模式更像生產(chǎn)的一個(gè)復(fù)合產(chǎn)品,并且復(fù)雜的部件不同所構(gòu)成的不同,而工廠模式僅是產(chǎn)品。同時(shí)建造者模式關(guān)注復(fù)雜產(chǎn)品細(xì)節(jié)的創(chuàng)建。但是工廠模式僅關(guān)心產(chǎn)品的創(chuàng)建,不在乎其細(xì)節(jié)的創(chuàng)建。
做自己生命的主角,而不是別人生命中的看客。
?
C#設(shè)計(jì)模式系列目錄 <https://www.cnblogs.com/hulizhong/p/11394686.html>
歡迎大家掃描下方二維碼,和我一起踏上設(shè)計(jì)模式的闖關(guān)之路吧!
?
熱門工具 換一換