詳解C#設(shè)計模式編程中生成器模式的使用
一、概述
在軟件系統(tǒng)中,有時候面臨著復(fù)雜的對象創(chuàng)建,該對象由一定算法構(gòu)成的子對象組成,由于需求變化,這些子對象會經(jīng)常變換,但組合在一起的算法卻是穩(wěn)定的。生成器模式可以處理這類對象的構(gòu)建,它提供了一種封裝機制來隔離各類子對象的變化,從而保證系統(tǒng)的穩(wěn)定。
二、生成器模式
生成器模式將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。其結(jié)構(gòu)圖如下:
- Builder為創(chuàng)建Product對象的各個子對象指定抽象接口。
- ConcreteBuilder實現(xiàn)了Builder接口,用于創(chuàng)建Product對象的各個子對象。
- Director使用Builder來創(chuàng)建Product對象。
- Product表示被構(gòu)造的復(fù)雜對象。
三、示例
using System; using System.Collections.Generic; using System.Text; namespace BuilderPattern { /// <summary> /// 所有課程 /// </summary> public class Coures { /// <summary> /// 保存課程信息 /// </summary> IDictionary<string, decimal> coures = new Dictionary<string, decimal>(); /// <summary> /// 選課 /// </summary> /// <param name="serialNumber"></param> /// <param name="score"></param> public void Select(string serialNumber, decimal score) { coures.Add(serialNumber, score); } /// <summary> /// 計算總學分 /// </summary> /// <returns>總學分</returns> public decimal ComputeScores() { decimal scores = 0; foreach (KeyValuePair<string, decimal> kvp in coures) { Console.WriteLine(kvp.Key + ":" + kvp.Value); Console.WriteLine(" "); scores += kvp.Value; } return scores; } } /// <summary> /// 選課建造者抽象類,表現(xiàn)(下面的抽象函數(shù))是相對穩(wěn)定的。 /// </summary> public abstract class Builder { /// <summary> /// 必修課程成績 /// </summary> public abstract void BuildCompulsory(); /// <summary> /// 選修課程成績 /// </summary> public abstract void BuildElective(); /// <summary> /// 限制課程成績 /// </summary> public abstract void BuildRestriction(); /// <summary> /// 獲得課程字典對象 /// </summary> /// <returns></returns> public abstract Coures GetCoures(); } /// <summary> /// 本科生選課成績 /// </summary> public class UndergraduateBuilder : Builder { private Coures coures = new Coures(); /// <summary> /// 本科生選必修課程成績 /// </summary> public override void BuildCompulsory() { coures.Select("001", 80M); } /// <summary> /// 本科生選選修課程成績 /// </summary> public override void BuildElective() { coures.Select("101", 85M); } /// <summary> /// 本科生選限制課程成績 /// </summary> public override void BuildRestriction() { coures.Select("201", 95M); } /// <summary> /// 本科生選獲得課程字典對象 /// </summary> /// <returns></returns> public override Coures GetCoures() { return coures; } } /// <summary> /// 研究生選課成績 /// </summary> public class GraduateBuilder : Builder { private Coures coures = new Coures(); /// <summary> /// 研究生選必修課程成績 /// </summary> public override void BuildCompulsory() { coures.Select("S001", 70M); } /// <summary> /// 研究生選選修課程成績 /// </summary> public override void BuildElective() { coures.Select("S101", 75M); } /// <summary> /// 研究生選限制課程成績 /// </summary> public override void BuildRestriction() { coures.Select("S201", 80M); } /// <summary> /// 研究生選獲得課程字典對象 /// </summary> /// <returns></returns> public override Coures GetCoures() { return coures; } } /// <summary> /// 課程成績管理類 /// </summary> public class CourseScoresManager { /// <summary> /// 這里的參數(shù)便是未確定的 /// </summary> /// <param name="builder"></param> public void CourseScoresManager(Builder builder) { builder.BuildCompulsory(); builder.BuildElective(); builder.BuildRestriction(); } } class Program { static void Main(string[] args) { /* Builder instance = new UndergraduateBuilder(); */ Builder instance = new GraduateBuilder(); CourseScoresManager courseScoresManager = new CourseScoresManager(instance); Coures coures = instance.GetCoures(); decimal totalScores = coures.ComputeScores(); Console.WriteLine(totalScores); Console.WriteLine(" "); Console.ReadLine(); } } }
四、使用場景
應(yīng)用場景是當創(chuàng)建一個復(fù)雜的對象時,這個對象由各個子對象構(gòu)成,而由于需求的變化導(dǎo)致子對象的性質(zhì)也是未確定的。
我們一般為一個類提供構(gòu)造函數(shù),并利用這個構(gòu)造函數(shù)完成對象的創(chuàng)建工作。當客戶知道為哪個類創(chuàng)建實例,并知道構(gòu)造函數(shù)的參數(shù)時(假設(shè)是用帶參數(shù)的構(gòu)造函數(shù))。然而由于條件的現(xiàn)限制,是無法用通常的方式來構(gòu)造對象的實例! 在進行對象構(gòu)造之前,要逐步收集與構(gòu)造相關(guān)的信息.那么創(chuàng)建對象的過程和對象的表現(xiàn)就應(yīng)該分離開來。此時對象的表現(xiàn)是相對穩(wěn)定的。
上一篇:c#檢測文本文件編碼的方法
欄 目:C#教程
下一篇:深入解析C#設(shè)計模式中對橋接模式的具體運用
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6675.html
您可能感興趣的文章
- 01-10C#編程實現(xiàn)自定義熱鍵的方法
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10深入淺出23種設(shè)計模式
- 01-10C#中Socket通信用法實例詳解
- 01-10C#編程自學之數(shù)據(jù)類型和變量二
- 01-10C#編程自學之開篇介紹
- 01-10C#編程自學之數(shù)據(jù)類型和變量三
- 01-10C#編程自學之運算符和表達式
- 01-10C#裝箱和拆箱原理詳解
- 01-10C#編程自學之類和對象


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置