詳解C#設計形式編程中生成器形式的應用。本站提示廣大學習愛好者:(詳解C#設計形式編程中生成器形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C#設計形式編程中生成器形式的應用正文
1、概述
在軟件體系中,有時刻面對著龐雜的對象創立,該對象由必定算法組成的子對象構成,因為需求變更,這些子對象會常常變換,但組合在一路的算法倒是穩固的。生成器形式可以處置這類對象的構建,它供給了一種封裝機制來隔離各類子對象的變更,從而包管體系的穩固。
2、生成器形式
生成器形式將一個龐雜對象的構建與它的表現分別,使得異樣的構建進程可以創立分歧的表現。其構造圖以下:
3、示例
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(); } } }
4、應用場景
運用場景是當創立一個龐雜的對象時,這個對象由各個子對象組成,而因為需求的變更招致子對象的性質也是未肯定的。
我們普通為一個類供給結構函數,並應用這個結構函數完成對象的創立任務。當客戶曉得為哪一個類創立實例,並曉得結構函數的參數時(假定是用帶參數的結構函數)。但是因為前提的現限制,是沒法用平日的方法來結構對象的實例! 在停止對象結構之前,要慢慢搜集與結構相干的信息.那末創立對象的進程和對象的表示就應當分別開來。此時對象的表示是絕對穩固的。