標籤:image bst sof 視頻 .text disk erp 對象 rdd
引言
上一篇介紹了設計模式中的抽象原廠模式-C#設計模式(3)-抽象原廠模式,本篇將介紹建造者模式;
點擊這裡查看全部設計模式系列文章導航
建造者模式簡介
建造者模式是將一個複雜物件的構建與表示分離,使得同樣的構建過程可以建立不同的表示。
在軟體系統中,有時候會面臨著“一個複雜物件”的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜的對象的各個部分可能面臨著劇烈的變化,但是把他們組合在一起的演算法很穩定。提供一種“封裝機制”來隔離出“複雜物件的各個部分”的變化,從而保持系統中的“穩定構建演算法”不隨著需求的改變而改變。
執行個體情境
對於軟體公司來講,公司有研發人員和非研發人員(包括行政人員、管理員等),每次入職新人,公司的IT人員就需要給新員工配一台電腦,但不同員工需要不同的配置的電腦,研發人員需要配置較高一點的電腦,行政人員需要的配置要求就沒那麼高;當然需要的配置可能很多,如安裝公司用來遊戲比賽時用的電腦、UE工程師使用的電腦、做視頻用等等需要的配置可能都一樣;這裡我們僅以研發用電腦、辦公用電腦為例;
但無論配置高低都需要給入職人員配置一台新電腦;下面我們用該情境講解一下建造者模式;
執行個體代碼類圖
建造者
建造者抽象類別,這裡講安裝電腦的過程標準化
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace BuilderPattern{ /// <summary> /// 抽象安裝電腦過程 /// </summary> public abstract class ComputerBuilder { /// <summary> /// 安裝記憶體條 /// </summary> public abstract void SetupMemory(); /// <summary> /// 安裝硬碟 /// </summary> public abstract void SetupHarddisk(); /// <summary> /// 安裝作業系統 /// </summary> public abstract void SetupOperatingSystem(); //安裝電腦還需要其它很多步驟,如安裝CPU、主板等等,這裡不全部列舉 }}
如果安裝研發人員使用的電腦
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace BuilderPattern{ /// <summary> /// 安裝研發人員使用電腦 /// </summary> public class DevelopmentComputerBuilder:ComputerBuilder { /// <summary> /// 安裝記憶體 /// </summary> public override void SetupMemory() { Console.WriteLine("安裝一個12G記憶體條(開發機記憶體需要配置大一點)"); } /// <summary> /// 安裝硬碟 /// </summary> public override void SetupHarddisk() { Console.WriteLine("安裝一個1T硬碟"); } /// <summary> /// 安裝作業系統 /// </summary> public override void SetupOperatingSystem() { Console.WriteLine("安裝WIN7系統(開發機需要安裝各種開發工具,win7系統較穩定)"); } }}
如果安裝普通辦公使用的電腦
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace BuilderPattern{ /// <summary> /// 安裝普通辦公電腦 /// </summary> public class OfficeComputerBuilder:ComputerBuilder { /// <summary> /// 安裝記憶體 /// </summary> public override void SetupMemory() { Console.WriteLine("安裝一個4G記憶體條"); } /// <summary> /// 安裝硬碟 /// </summary> public override void SetupHarddisk() { Console.WriteLine("安裝500G硬碟"); } /// <summary> /// 安裝作業系統 /// </summary> public override void SetupOperatingSystem() { Console.WriteLine("安裝WIN10系統"); } }}
當然需要的配置可能很多,如安裝公司用來遊戲比賽時用的電腦、UE工程師使用的電腦、做視頻用等等需要的配置可能都一樣;這裡不一 一列舉;
指揮者
指揮者類的目的就是根據使用人需求的不同來安裝電腦,而使用人或者使用者不需要知道安裝的過程,而這裡面的每一個步驟都是必須的;
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace BuilderPattern{ class ComputerDirector { public void ConstructComputer(ComputerBuilder builder) { //安裝記憶體條 builder.SetupMemory(); //安裝硬碟 builder.SetupHarddisk(); //安裝作業系統 builder.SetupOperatingSystem(); } }}業務調用
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace BuilderPattern{ class Program { static void Main(string[] args) { Console.WriteLine("----------------開始安裝電腦-------------------------------------"); //研發人員使用電腦安裝 建造者 ComputerBuilder builder = new DevelopmentComputerBuilder(); //普通辦公使用電腦安裝 建造者 //ComputerBuilder builder = new OfficeComputerBuilder(); ComputerDirector director = new ComputerDirector(); director.ConstructComputer(builder); Console.WriteLine("----------------安裝完成--------------------------------"); Console.ReadKey(); } }}
如果安裝研發使用電腦,運行結果如下
如果安裝普通辦公使用電腦,運行結果如下
建造者模式結構圖
本文執行個體中:
Builder就是安裝電腦的抽象類別 ;
ConstructBuilder為具體的建造者,就是上述的辦公用電腦安裝、研發用電腦安裝;均具體實現了電腦安裝抽象類別;
Product產品就是具體的電腦;
Derictor,指揮者,上述樣本即根據使用者具體的需求安裝不同配置的電腦;
總結
適用情境
1、需要產生的產品對象有複雜的內部結構,這些產品對象通常包含多個成員屬性。
2、隔離複雜物件的建立和使用,並使得相同的建立過程可以建立不同的產品。
建造者模式所建立的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,則不適合使用建造者模式。
優缺點
優點:
建造者模式的使用使得產品的內部表象可以獨立的變化。使用建造者模式可以使用戶端不必知道產品內部組成的細節。
將複雜產品的建立步驟分解在不同的方法中,使得建立過程更加清晰,使得我們能夠更加精確的控制複雜物件的產生過程。
每一個Builder都相對獨立,而與其它的Builder無關(一個產品有一個Builder相對應),可以很方便的增加或替換建造者。
缺點:
建造者的缺點在與如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大,這樣這個模式就不適用。
C#設計模式(5)-建造者模式