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

詳解C#設計形式編程中生成器形式的應用

編輯:C#入門知識

詳解C#設計形式編程中生成器形式的應用。本站提示廣大學習愛好者:(詳解C#設計形式編程中生成器形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C#設計形式編程中生成器形式的應用正文


1、概述
在軟件體系中,有時刻面對著龐雜的對象創立,該對象由必定算法組成的子對象構成,因為需求變更,這些子對象會常常變換,但組合在一路的算法倒是穩固的。生成器形式可以處置這類對象的構建,它供給了一種封裝機制來隔離各類子對象的變更,從而包管體系的穩固。
2、生成器形式
生成器形式將一個龐雜對象的構建與它的表現分別,使得異樣的構建進程可以創立分歧的表現。其構造圖以下:

201622592147347.gif (424×179)

  • Builder為創立Product對象的各個子對象指定籠統接口。
  • ConcreteBuilder完成了Builder接口,用於創立Product對象的各個子對象。
  • Director應用Builder來創立Product對象。
  • Product表現被結構的龐雜對象。


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、應用場景
      運用場景是當創立一個龐雜的對象時,這個對象由各個子對象組成,而因為需求的變更招致子對象的性質也是未肯定的。
 我們普通為一個類供給結構函數,並應用這個結構函數完成對象的創立任務。當客戶曉得為哪一個類創立實例,並曉得結構函數的參數時(假定是用帶參數的結構函數)。但是因為前提的現限制,是沒法用平日的方法來結構對象的實例! 在停止對象結構之前,要慢慢搜集與結構相干的信息.那末創立對象的進程和對象的表示就應當分別開來。此時對象的表示是絕對穩固的。

 

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