暫停了一週,因爲種種緣由吧,外在的,內在的,各類致使了學習暫定了一週,連續學習真的是一件很難的事情。程序員
最近在換工做,從一家偉大的公司換到另一家偉大的公司,緣由只是不想再呆在外包,請原諒個人膚淺設計模式
不過,學習使我快樂ide
設計模式,不要迷信,也不要輕信,但不可不知道,如今衆所周知的23種設計模式只是對前人們的進行一個總結,不是說只有這23種,切記學習
今天介紹 建造者模式ui
建造者,Builder,擁有上帝視角,毫不出錯spa
建造者模式:將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示設計
敲黑板了,注意看,3個點3d
1.處理的是一個複雜對象,簡單對象就沒有必要用此模式了,每次模式的運用,都是類結構的複雜化過程,注意權衡得失利弊code
2.構建與表示分離,分離是爲了更好的相遇對象
3.一樣的過程,不一樣的表示,就是經歷相同的過程,能產生不同的對象,就好像128G和256G的蘋果手機,裝配過程徹底相同,但倒是不一樣的型號的手機(此未考證,純屬爲了舉例而舉例)
複雜,分離,相同
三個詞,咱們舉個例子,細細品味下
法式大餐,堪稱西餐之首,程序複雜,過程繁多
法國大餐至少有五道,你帶着你女友準備去浪漫一回【程序員怎麼會有女友,這是個bug】,第一次到了法式餐廳,你得點餐吧,你不會直接去後廚告訴大廚,你要羊扒陪香檳加咖啡吧,你也不知道法式大餐有5道菜啊,並且你發現,服務員特別推薦他們今天的2種套餐,咱們姑且稱爲Alpha法式大餐和Beta法式大餐。因而你就想,要不來個A餐吧,因而服務員知道你要A餐,點餐完畢,就等上菜了
基於以上,咱們來看看代碼怎麼實現,代碼即生活啊
首先咱們有一個法式大餐的類,這個類規定,咱們法式大餐至少5道
/// <summary> /// 法式大餐 /// </summary> public abstract class FrenchDinner { /// <summary> /// 開胃酒 /// </summary> public abstract void Aperitif(); /// <summary> /// 前菜 /// </summary> public abstract void Appetizer(); /// <summary> /// 主菜 /// </summary> public abstract void MainCourse(); /// <summary> /// (餐後)甜點 /// </summary> public abstract void Dessert(); /// <summary> /// 咖啡 /// </summary> public abstract void Coffee(); }
那今天餐廳特別推薦 Alpha法式大餐 和 Beta法式大餐
/// <summary> /// Alpha法式大餐 /// </summary> public class AlphaFrenchDinner : FrenchDinner { public AlphaFrenchDinner() { Console.WriteLine("這是 Alpha 法式大餐"); } /// <summary> /// 開胃酒 /// </summary> public override void Aperitif() { Console.WriteLine("開胃酒:紅葡萄酒"); } /// <summary> /// 前菜 /// </summary> public override void Appetizer() { Console.WriteLine("前菜:沙拉"); } /// <summary> /// 主菜 /// </summary> public override void MainCourse() { Console.WriteLine("主菜:牛排"); } /// <summary> /// (餐後)甜點 /// </summary> public override void Dessert() { Console.WriteLine("甜點:蛋奶酥"); } /// <summary> /// 咖啡 /// </summary> public override void Coffee() { Console.WriteLine("咖啡:卡布奇諾"); } } /// <summary> /// Beta法式大餐 /// </summary> public class BetaFrenchDinner : FrenchDinner { public BetaFrenchDinner() { Console.WriteLine("這是Beta 法式大餐"); } /// <summary> /// 開胃酒 /// </summary> public override void Aperitif() { Console.WriteLine("開胃酒:香檳"); } /// <summary> /// 前菜 /// </summary> public override void Appetizer() { Console.WriteLine("前菜:海鮮"); } /// <summary> /// 主菜 /// </summary> public override void MainCourse() { Console.WriteLine("主菜:羊扒"); } /// <summary> /// (餐後)甜點 /// </summary> public override void Dessert() { Console.WriteLine("甜點:慕斯"); } /// <summary> /// 咖啡 /// </summary> public override void Coffee() { Console.WriteLine("咖啡:紅茶"); } }
那你不能本身去告訴後廚說你要A餐吧,這個時候有個服務員,這個就是咱們建造者模式中最重要的角色
/// <summary> /// /// </summary> public class FrenchDirector { public FrenchDirector(FrenchDinner frenchDinner) { _frenchDinner = frenchDinner; } private FrenchDinner _frenchDinner; /// <summary> /// build法式大餐 /// </summary> public void CreateFrenchDinner() { _frenchDinner.Aperitif(); _frenchDinner.Appetizer(); _frenchDinner.MainCourse(); _frenchDinner.Dessert(); _frenchDinner.Coffee(); } }
那輪到你上場了,也就是咱們怎麼調用了
static void Main() { var director = new FrenchDirector(new BetaFrenchDinner());//請幫我點個B餐 director.CreateFrenchDinner(); Console.ReadLine(); }
最後的輸出是
「這是Beta 法式大餐」
「開胃酒:香檳」
「前菜:海鮮」
「主菜:羊扒」
「甜點:慕斯」
「咖啡:紅茶」
總結下
優勢
1.顯而易見,複雜的對象被輕鬆建立,而且不會少一步也不會多一步
2.若是還有C餐,D餐,咱們只須要繼續增長相關類便可
3.若是法式大餐要在家吃,須要跳過開胃酒,直接進入主菜和甜品,那咱們只須要再多建立一個建造者類FrenchDirector便可
缺點
一、對象必須有共同點,範圍受到限制,好比我想增長一道程序,則咱們須要修改的每個繼承者
二、如內部變化複雜,會有不少的建造者類,增長了系統的複雜程度
以上就是關於 建造者模式 的分享,來的晚些,但不會缺席