程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 詳解C#設計模式編程中生成器模式的使用

詳解C#設計模式編程中生成器模式的使用

編輯:關於C語言

一、概述
在軟件系統中,有時候面臨著復雜的對象創建,該對象由一定算法構成的子對象組成,由於需求變化,這些子對象會經常變換,但組合在一起的算法卻是穩定的。生成器模式可以處理這類對象的構建,它提供了一種封裝機制來隔離各類子對象的變化,從而保證系統的穩定。
二、生成器模式
生成器模式將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。其結構圖如下:

201622592147347.gif (424×179)

  • Builder為創建Product對象的各個子對象指定抽象接口。
  • ConcreteBuilder實現了Builder接口,用於創建Product對象的各個子對象。
  • Director使用Builder來創建Product對象。
  • Product表示被構造的復雜對象。


三、示例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 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> /// 選課建造者抽象類,表現(下面的抽象函數)是相對穩定的。 /// </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> /// 這裡的參數便是未確定的 /// </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(); } } }

四、使用場景
應用場景是當創建一個復雜的對象時,這個對象由各個子對象構成,而由於需求的變化導致子對象的性質也是未確定的。
我們一般為一個類提供構造函數,並利用這個構造函數完成對象的創建工作。當客戶知道為哪個類創建實例,並知道構造函數的參數時(假設是用帶參數的構造函數)。然而由於條件的現限制,是無法用通常的方式來構造對象的實例! 在進行對象構造之前,要逐步收集與構造相關的信息.那麼創建對象的過程和對象的表現就應該分離開來。此時對象的表現是相對穩定的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved