標籤:c# 設計模式
建造者模式(Builder Pattern)
一聽這個名字,你可能就會猜到一二分了。建造者簡單理解就是造東西,只不過建造者模式建造的不是一個簡單的東西,是一個比較複雜的東西。就好像蓋房子,需要打地基、砌牆、灌水泥、封頂,最後牆面貼瓷磚。
建造者設計模式是一個構造複雜物件的設計模式。在一個軟體系統中,可能會面臨建立一個複雜物件的工作,如果我們使用單一的方法或者單一的對象來建立會比較煩瑣,當所建立複雜物件發生改變時,整個系統就可能面臨劇烈的變化。這時就需要我們將這個複雜物件的建立過程分解成若干部分,各個子部分用一定的演算法構成。
但是,子部分可能會經常發生改變,如何能保證整體建立工作的穩定性呢?這就需要建造者模式的支援了。建造者模式把複雜物件的建立與表示分離,使得同樣的構建過程可以建立不同的表示。
前兩天同學新買了一部HUAWEI P6-T00
,智能手機就是智能,用流量用那叫一個快啊!,簡直如行雲流水一般,一會兒50M流量就不見了,真的讓人懷疑手機開發商是不是和移動公司有什麼陷阱。。。沒辦法,又不能不用手機,又不能不上網,最後只能妥協,去營業廳更換套餐吧。下面就給大家講講動感地帶上網套餐:
動感地帶上網套餐?是什麼樣的上網套餐呢?上網套餐有N多種,如何來表示這種表現形式多樣化的上網套餐?
1.我們可以肯定的一點是最終的上網套餐是由哪幾個部分組成的是確定的(業務名稱、月消費、免費時間長度、流量和簡訊),也就是結構是知道的,但是套餐究竟是什麼樣子的不知道
2.是建造者模式實現上網套餐的靜態類圖。建造者模式將複雜物件的構造過程分解細化,使得每一個組件完成比較獨立的工作(功能單一獨立,高內聚),各個組件之間的關聯不是很緊密(松耦合);同時,又使得構件和表示相分離
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Builder{ //套餐建造類 abstract class MealBuilder { public abstract void BuildName(); //業務名稱 public abstract void BuildExpense(); //固定費用 public abstract void BuildVoice(); //贈送語音 public abstract void BuildFlow(); //贈送流量 public abstract void BuildMessage(); //贈送簡訊 } //具體套餐建造類(18) class Meal_18Builder : MealBuilder { public override void BuildName() { Console.WriteLine("動感地帶上網套餐(18元)"); } public override void BuildExpense() { Console.WriteLine("固定費用:18/月"); } public override void BuildVoice() { Console.WriteLine("贈送語音:30分鐘"); } public override void BuildFlow() { Console.WriteLine("贈送流量:50M"); } public override void BuildMessage() { Console.WriteLine("贈送簡訊:100條"); } } //具體套餐建造類(28) class Meal_28Builder : MealBuilder { public override void BuildName() { Console.WriteLine("動感地帶上網套餐(28元)"); } public override void BuildExpense() { Console.WriteLine("固定費用:28/月"); } public override void BuildVoice() { Console.WriteLine("贈送語音:50分鐘"); } public override void BuildFlow() { Console.WriteLine("贈送流量:100M"); } public override void BuildMessage() { Console.WriteLine("贈送簡訊:150條"); } } //具體套餐建造類(38) class Meal_38Builder : MealBuilder { public override void BuildName() { Console.WriteLine("動感地帶上網套餐(38元)"); } public override void BuildExpense() { Console.WriteLine("固定費用:38/月"); } public override void BuildVoice() { Console.WriteLine("贈送語音:80分鐘"); } public override void BuildFlow() { Console.WriteLine("贈送流量:200M"); } public override void BuildMessage() { Console.WriteLine("贈送簡訊:200條"); } } //指揮者類 class Director { private MealBuilder meal; public Director(MealBuilder meal) { this.meal = meal; } public void CreateMeal() { meal.BuildName(); meal.BuildExpense(); meal.BuildVoice(); meal.BuildFlow(); meal.BuildMessage(); } } class Program { static void Main(string[] args) { MealBuilder meal_28builder = new Meal_28Builder(); Director director_28 = new Director(meal_28builder); director_28.CreateMeal(); Console.WriteLine(); MealBuilder meal_38builder = new Meal_38Builder(); Director director_38 = new Director(meal_38builder); director_38.CreateMeal(); } }}
Builder(抽象建造者):它為建立一個產品Product對象的各個組件指定抽象介面,在該介面中一般聲明兩類方法,一類方法是buildPartX(),它們用於建立複雜物件的各個組件;另一類方法是getResult(),它們用於返回複雜物件。Builder既可以是抽象類別,也可以是介面。
ConcreteBuilder(具體建造者):它實現了Builder介面,實現各個組件的具體構造和裝配方法,定義並明確它所建立的複雜物件,也可以提供一個方法返回建立好的複雜產品對象。
Product(產品角色):它是被構建的複雜物件,包含多個組成組件,具體建造者建立該產品的內部表示並定義它的裝配過程。
Director(指揮者):指揮者又稱為導演類,它負責安排複雜物件的建造次序,指揮者與抽象建造者之間存在關聯關係,可以在其construct()建造方法中調用建造者對象的組件構造與裝配方法,完成複雜物件的建造。用戶端一般只需要與指揮者進行互動,在用戶端確定具體建造者的類型,並執行個體化具體建造者對象(也可以通過設定檔和反射機制),然後通過指揮者類的建構函式或者Setter方法將該對象傳入指揮者類中。
建造者模式的優點:
建造者將構建和表示分離,有效地將複雜物件處理過程分解,降低功能模組之間的耦合度,增強模組內部的內聚度,使得其在軟體設計模式中具有極其重要的位置。
建造者模式的缺點:
1.建造者模式所建立的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,例如很多組成部分都不相同,不適合使用建造者模式,因此其使用範圍受到一定的限制。
2.如果產品的內部變化複雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大,增加系統的理解難度和運行成本。
建造者與抽象工廠的區別:
抽象工廠和建造者有相似之處,它們都是建立複雜物件的設計模式,區別在於建造者著重於分步驟構造一個複雜物件,而抽象工廠則著重於多個系列的產品對象即對象族(簡單的或複雜的)的構造。
使用場合
1.當產生的產品對象內部具有複雜的結構時;
2.當複雜物件需要與表示分離,可能需要建立不同的表示時;
3.當需要向客戶隱藏產品內部結構的表現時。