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


閱讀排行
- 1C語言 while語句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
 - 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
 - 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
 - 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
 - 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
 - 01-10C#停止線程的方法
 - 01-10C#實(shí)現(xiàn)清空回收站的方法
 - 01-10C#通過重寫Panel改變邊框顏色與寬度的
 - 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
 
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 01-11ajax實(shí)現(xiàn)頁面的局部加載
 - 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-10delphi制作wav文件的方法
 - 04-02jquery與jsp,用jquery
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
 


