日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式(4)建造者模式/生成器模式(Builder)

發布時間:2024/9/21 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式(4)建造者模式/生成器模式(Builder) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

設計模式(0)簡單工廠模式

設計模式(1)單例模式(Singleton)

設計模式(2)工廠方法模式(Factory Method)

設計模式(3)抽象工廠模式(Abstract Factory)

源碼地址

0 建造者模式簡介

0.0 建造者模式定義

建造者模式是一種常見的創建型模式,也稱生成器模式。建造者模式的一般書面化定義為:將一個復雜對象的構建與該對象的表示分離,使得同樣的構建過程可以創建不同的表示

建造者模式主要用于構建復雜產品,并且該產品是可以步驟化或者模塊化的,最終可以根據步驟或模塊組裝創建出一個復雜產品。

現實生活中我們每天都在使用的手機有不同品牌不同型號,千差萬別,但他們都具有屏幕、電池、外殼、核心(CPU、GUPU、ROM、RAM等)共性模塊,即他們的創建過程是一致的,變化的只是每個步驟/模塊的詳細實現細節。這種情景是使用創建者模式的最佳時機,最終產品構建過程是統一且固定的,我們將變化的部分交給建造者,只需要配置不同的建造者,就可以使同樣的構建過程生產出完全不同的產品。

建造者模式的結構圖如下

Director:指導者,主要用來使用Buider接口,以一個統一固定的過程生產最終的產品Product

Builder:建造者抽象接口,定義創建一個Product對象所需各個部件的操作。在該接口中一般要求包含創建部件的方法如buidPartA,buidPartB等,同時還要包含一個獲取最終創建的復雜對象的方法getResult()。builder可以定義為一個抽象類或者接口

ConcreteBuilder:具體的建造者實現,繼承自Builder接口,實現接口中定義的創建部件及返回產品的方法。在這里不同的創建者實現類,對同一部件或步驟進行不同的詳細實現,來完成不同產品的創建。

Product:最終產品類,表示被建造者構建出來的復雜對象,其用于多個固定的部件或步驟。

0.1 建造者模式應用場景

我們以英雄祭壇里造英雄這一過程為例。在使用模式之前,我們最直接的代碼應該像下面這樣。

惡魔獵手創建類

/// <summary> /// 惡魔獵手創建類 /// </summary> public class DH {/// <summary>/// 創建英雄/// </summary>/// <returns></returns>public string BuilderHero(){string body = "黑夜給了我黑色眼睛,我卻用它去尋找光明。"; // 創建身體string weapon = "艾辛諾斯雙刃。"; // 創建武器string mount = "我有這雙腳有這雙腿。"; // 創建坐騎return body + weapon + mount;} }

同樣,月之女祭司創建類

/// <summary> /// 月之女祭司創建類 /// </summary> public class POM {/// <summary>/// 創建英雄/// </summary>/// <returns></returns>public string BuilderHero(){string body = "夜幕只為朱顏改,群星隕落無窮。"; // 創建身體string weapon = "索利達爾·群星之怒。"; // 創建武器string mount = "艾斯卡達爾。"; // 創建坐騎return body + weapon + mount;} }

客戶調用時只需要實例化不同的英雄創建類,來完成對應英雄的創建。

DH dh = new DH(); Console.WriteLine(dh.BuilderHero()); POM pom = new POM(); Console.WriteLine(pom.BuilderHero()); Console.ReadLine();

這樣我們需要別的英雄時只需要再添加一個創建該英雄對應的類。

我們這里只是簡單的通過一句話描述創建了英雄身體、武器、坐騎三個關鍵部位,而實際中一個復雜產品的構件過程是遠遠要復雜的多,比如我們常見的文件導出,一個文件有頭、內容、尾部說明三類內容,導出txt格式跟導出xml格式的操作,每個部位的創建都要根據不同的格式進行處理。

同時我們發現這樣一種情況,每個英雄創建類中創建英雄的方法其實都是同一種模式,處理步驟完全一樣,唯一變化的部分就在于每個步驟的具體實現細節,我們自然會考慮

1、創建每個英雄都要用到同樣的步驟,對與固定不變的部分,我們要提煉出來,形成統一且公用的處理過程

2、英雄不只這兩個,還會有很多其他英雄需要創建,要求我們在處理過程不變的情況下,能實現創建不同英雄的需要

也就是說,我們的固定不變的處理過程應該和變化的具體實現分離,從而達到固定處理過程的復用,同時還能滿足不同具體實現的需求,此時的需求已經和前面介紹過的建造者模式非常貼近了。

1 建造者模式詳解

0、提煉具體產品類

將上面用字符串表示的英雄的三個特征使用一個英雄類表示

/// <summary> /// 英雄類 /// </summary> public class Hero {/// <summary>/// 身體特征/// </summary>public string Body { get; set; }/// <summary>/// 武器/// </summary>public string Weapon { get; set; }/// <summary>/// 坐騎/// </summary>public string Mount { get; set; } }

1、建造者接口

建造者接口包含創建各部位的方法定義,及獲取最終產品方法的定義

/// <summary> /// 建造者接口 /// </summary> public interface IBuilder {/// <summary>/// 創建身體特征/// </summary>/// <returns></returns>void BuildBody();/// <summary>/// 創建武器/// </summary>/// <returns></returns>void BuildWepon();/// <summary>/// 創建坐騎/// </summary>/// <returns></returns>void BuildMount();/// <summary>/// 獲取最終產品/// </summary>/// <returns></returns> Hero GetResult(); }

2、建造者具體實現類

惡魔獵手建造者實現類

/// <summary> /// 惡魔獵手建造者實現類 /// </summary> public class DHBuilder : IBuilder {private Hero _hero = new Hero();/// <summary>/// 創建身體特征/// </summary>/// <returns></returns>public void BuildBody(){_hero.Body = "黑夜給了我黑色眼睛,我卻用它去尋找光明。";}/// <summary>/// 創建武器/// </summary>/// <returns></returns>public void BuildWeapon(){_hero.Weapon= "艾辛諾斯雙刃。";}/// <summary>/// 創建坐騎/// </summary>/// <returns></returns>public void BuildMount(){_hero.Mount= "我有這雙腳有這雙腿。";}public Hero GetResult(){return _hero;} }

月之女祭司建造者類實現

/// <summary> /// 月之女祭司建造者類 /// </summary> public class POMBuilder : IBuilder {private Hero _hero = new Hero();/// <summary>/// 創建身體特征/// </summary>/// <returns></returns>public void BuildBody(){_hero.Body = "夜幕只為朱顏改,群星隕落無窮。";}/// <summary>/// 創建武器/// </summary>/// <returns></returns>public void BuildWeapon(){_hero.Weapon = "索利達爾·群星之怒。";}/// <summary>/// 創建坐騎/// </summary>/// <returns></returns>public void BuildMount(){_hero.Mount = "艾斯卡達爾。";}/// <summary>/// 創建最終產品/// </summary>/// <returns></returns>public Hero GetResult(){return _hero;}}

3 、指導者實現

/// <summary> /// 指導者 /// </summary> public class Director {/// <summary>/// 指導方法/// </summary>public void Construct(IBuilder builder){builder.BuildBody(); // 創建身體特征builder.BuildWeapon(); // 創建武器builder.BuildMount(); // 創建坐騎 } }

4、客戶端調用

Director director = new Director();DHBuilder buider1 = new DHBuilder(); director.Construct(buider1); Hero dh = buider1.GetResult();DHBuilder buider2 = new DHBuilder(); director.Construct(buider2); Hero pom = buider1.GetResult();

2 總結

建造者模式具有一下優點

1、松散耦合

建造者模式把產品的構建過程獨立出來,實現產品構建和產品表現的分離,從而使得構建算法可以復用,同時具體產品表現也可以靈活的擴展和切換。

2、可以很容易改變產品內部表示

在建造者模式中,Builder只提供接口給Director使用,具體的部件創建和裝配方式有具體的創建者實現類實現,Director不關注具體實現細節,這樣一來,如果像改變產品內部的表示,只需要修改具體建造者實現類即可。

3、更好的復用性

固定建造過程可以復用

轉載于:https://www.cnblogs.com/fonour/p/7412450.html

總結

以上是生活随笔為你收集整理的设计模式(4)建造者模式/生成器模式(Builder)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。