国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2020-01-24 01:15:39
字體:
供稿:網(wǎng)友

一、概述
在軟件系統(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)圖如下:

201622592147347.gif (424×179)

  • 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>    /// 計算總學(xué)分    /// </summary>    /// <returns>總學(xué)分</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)用場景是當(dāng)創(chuàng)建一個復(fù)雜的對象時,這個對象由各個子對象構(gòu)成,而由于需求的變化導(dǎo)致子對象的性質(zhì)也是未確定的。
 我們一般為一個類提供構(gòu)造函數(shù),并利用這個構(gòu)造函數(shù)完成對象的創(chuàng)建工作。當(dā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)定的。

 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 潢川县| 曲麻莱县| 犍为县| 海盐县| 色达县| 青海省| 蓝田县| 宜春市| 山阴县| 措美县| 和龙市| 通榆县| 兴海县| 卢龙县| 大连市| 海丰县| 双流县| 华蓥市| 阳江市| 怀仁县| 石门县| 息烽县| 富顺县| 阜新| 渝中区| 肥西县| 松滋市| 达日县| 尖扎县| 乌苏市| 晋中市| 榆林市| 开阳县| 秦安县| 黔东| 双峰县| 乌兰察布市| 田东县| 张家港市| 盘山县| 基隆市|