设计模式 之 建造者
生活随笔
收集整理的這篇文章主要介紹了
设计模式 之 建造者
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
建造者模式(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();}} }
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
建造者模式的長處:
? ? 建造者將構建和表示分離,有效地將復雜對象處理過程分解,減少功能模塊之間的耦合度,增強模塊內部的內聚度,使得其在軟件設計模式中具有極其重要的位置。
建造者模式的缺點:
? ? 1.建造者模式所創建的產品一般具有較多的共同點,其組成部分相似,假設產品之間的差異性非常大,比如非常多組成部分都不同樣,不適合使用建造者模式,因此其使用范圍受到一定的限制。
? ? 2.假設產品的內部變化復雜,可能會導致須要定義非常多詳細建造者類來實現這樣的變化,導致系統變得非常龐大,添加系統的理解難度和執行成本。
建造者與抽象工廠的差別:
? ? 抽象工廠和建造者有相似之處,它們都是創建復雜對象的設計模式,差別在于建造者著重于分步驟構造一個復雜對象,而抽象工廠則著重于多個系列的產品對象即對象族(簡單的或復雜的)的構造。
使用場合
? ? 1.當生成的產品對象內部具有復雜的結構時;
? ? 2.當復雜對象須要與表示分離,可能須要創建不同的表示時;
? ? 3.當須要向客戶隱藏產品內部結構的表現時。
? ? 一聽這個名字,你可能就會猜到一二分了。建造者簡單理解就是造東西,僅僅只是建造者模式建造的不是一個簡單的東西,是一個比較復雜的東西。就好像蓋房子,須要打地基、砌墻、灌水泥、封頂,最后墻面貼瓷磚。
? ? 建造者設計模式是一個構造復雜對象的設計模式。在一個軟件系統中,可能會面臨創建一個復雜對象的工作,假設我們使用單一的方法或者單一的對象來創建會比較煩瑣,當所創建復雜對象發生改變時,整個系統就可能面臨劇烈的變化。這時就須要我們將這個復雜對象的創建過程分解成若干部分,各個子部分用一定的算法構成。
? ? 可是,子部分可能會常常發生改變,怎樣能保證總體創建工作的穩定性呢?這就須要建造者模式的支持了。建造者模式把復雜對象的創建與表示分離,使得相同的構建過程能夠創建不同的表示。
? ? 前兩天同學新買了一部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(產品角色):它是被構建的復雜對象,包括多個組成部件,詳細建造者創建該產品的內部表示并定義它的裝配過程。
建造者模式的長處:
? ? 建造者將構建和表示分離,有效地將復雜對象處理過程分解,減少功能模塊之間的耦合度,增強模塊內部的內聚度,使得其在軟件設計模式中具有極其重要的位置。
建造者模式的缺點:
? ? 1.建造者模式所創建的產品一般具有較多的共同點,其組成部分相似,假設產品之間的差異性非常大,比如非常多組成部分都不同樣,不適合使用建造者模式,因此其使用范圍受到一定的限制。
? ? 2.假設產品的內部變化復雜,可能會導致須要定義非常多詳細建造者類來實現這樣的變化,導致系統變得非常龐大,添加系統的理解難度和執行成本。
建造者與抽象工廠的差別:
? ? 抽象工廠和建造者有相似之處,它們都是創建復雜對象的設計模式,差別在于建造者著重于分步驟構造一個復雜對象,而抽象工廠則著重于多個系列的產品對象即對象族(簡單的或復雜的)的構造。
使用場合
? ? 1.當生成的產品對象內部具有復雜的結構時;
? ? 2.當復雜對象須要與表示分離,可能須要創建不同的表示時;
? ? 3.當須要向客戶隱藏產品內部結構的表現時。
總結
以上是生活随笔為你收集整理的设计模式 之 建造者的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目已被os x使用 不能打开-黑苹果之
- 下一篇: 自己写着玩(二)