欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年02月25日 09:23:30   作者:scucj  
這篇文章主要介紹了詳解C#設計模式編程中生成器模式的使用,生成器模式主張創(chuàng)建對象的過程和對象的表現(xiàn)應該分離開來,需要的朋友可以參考下

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

201622592147347.gif (424×179)

  • Builder為創(chuàng)建Product對象的各個子對象指定抽象接口。
  • ConcreteBuilder實現(xiàn)了Builder接口,用于創(chuàng)建Product對象的各個子對象。
  • Director使用Builder來創(chuàng)建Product對象。
  • Product表示被構造的復雜對象。


三、示例

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();
    }
  }
}

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

 

相關文章

  • C#泛型和反射實例解析

    C#泛型和反射實例解析

    這篇文章主要介紹了C#泛型和反射實例解析,對于C#初學者理解泛型和反射有很好的幫助借鑒作用,需要的朋友可以參考下
    2014-08-08
  • C#中const和readonly的用法比較

    C#中const和readonly的用法比較

    今天小編就為大家分享一篇關于C#中const和readonly的用法比較,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • C#鍵盤輸入回車鍵實現(xiàn)點擊按鈕效果的方法

    C#鍵盤輸入回車鍵實現(xiàn)點擊按鈕效果的方法

    這篇文章主要介紹了C#鍵盤輸入回車鍵實現(xiàn)點擊按鈕效果的方法,可實現(xiàn)用回車鍵代替點擊按鈕的功能,是非常實用的技巧,需要的朋友可以參考下
    2014-09-09
  • Unity TextMeshPro實現(xiàn)富文本超鏈接默認字體追加字體

    Unity TextMeshPro實現(xiàn)富文本超鏈接默認字體追加字體

    這篇文章主要為大家介紹了Unity TextMeshPro實現(xiàn)富文本超鏈接默認字體追加字體示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • C#圖片處理3種高級應用

    C#圖片處理3種高級應用

    本文介紹C#圖片處理高級應用,這些功能并無多大技術含量。全部基于.Net Framework類庫完成,代碼中包含了C#圖片處理的一些基礎知識,與大家分享,個人能力有限,不足之處還請及時指正。
    2015-10-10
  • c# 命名空間和程序集

    c# 命名空間和程序集

    命名空間:用于對相關的類型進行邏輯分組,使用命名空間方便定位一個類型
    2012-10-10
  • 帶你一文了解C#中的LINQ

    帶你一文了解C#中的LINQ

    c#提供的ling查詢極大的遍歷了集合的查詢過程,且使用簡單方便,非常的有用,下面這篇文章主要給大家介紹了關于C#中LINQ的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • C#實現(xiàn)拼圖游戲

    C#實現(xiàn)拼圖游戲

    這篇文章主要為大家詳細介紹了C#實現(xiàn)拼圖游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解DataGridView控件的數(shù)據(jù)綁定

    詳解DataGridView控件的數(shù)據(jù)綁定

    本文詳細講解了DataGridView控件的數(shù)據(jù)綁定,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • 解析C#中斷言與異常的應用方式及異常處理的流程控制

    解析C#中斷言與異常的應用方式及異常處理的流程控制

    這篇文章主要介紹了C#中斷言與異常的應用方式及異常處理的流程控制,一般來說斷言用于修正程序員自己的錯誤而異常用于應對程序運行過程中可能出現(xiàn)的錯誤,需要的朋友可以參考下
    2016-01-01

最新評論