当前位置: 首页 > 编程笔记 >

详解C#设计模式编程中生成器模式的使用

盖辉
2023-03-14
本文向大家介绍详解C#设计模式编程中生成器模式的使用,包括了详解C#设计模式编程中生成器模式的使用的使用技巧和注意事项,需要的朋友参考一下

一、概述
在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的。生成器模式可以处理这类对象的构建,它提供了一种封装机制来隔离各类子对象的变化,从而保证系统的稳定。
二、生成器模式
生成器模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。其结构图如下:

  • Builder为创建Product对象的各个子对象指定抽象接口。
  • ConcreteBuilder实现了Builder接口,用于创建Product对象的各个子对象。
  • Director使用Builder来创建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>
  /// 选课建造者抽象类,表现(下面的抽象函数)是相对稳定的。
  /// </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();
    }
  }
}

四、使用场景
      应用场景是当创建一个复杂的对象时,这个对象由各个子对象构成,而由于需求的变化导致子对象的性质也是未确定的。
 我们一般为一个类提供构造函数,并利用这个构造函数完成对象的创建工作。当客户知道为哪个类创建实例,并知道构造函数的参数时(假设是用带参数的构造函数)。然而由于条件的现限制,是无法用通常的方式来构造对象的实例! 在进行对象构造之前,要逐步收集与构造相关的信息.那么创建对象的过程和对象的表现就应该分离开来。此时对象的表现是相对稳定的。

 

 类似资料:
  • 本文向大家介绍详解C#设计模式编程中的模板方法模式使用,包括了详解C#设计模式编程中的模板方法模式使用的使用技巧和注意事项,需要的朋友参考一下 一、引言 提到模板,大家肯定不免想到生活中的“简历模板”、“论文模板”、“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载

  • 本文向大家介绍详解C++设计模式编程中对访问者模式的运用,包括了详解C++设计模式编程中对访问者模式的运用的使用技巧和注意事项,需要的朋友参考一下 访问者模式(visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地

  • 本文向大家介绍C++设计模式编程中的迭代器模式应用解析,包括了C++设计模式编程中的迭代器模式应用解析的使用技巧和注意事项,需要的朋友参考一下 迭代器模式:提供一种方法顺序访问一个聚合对象中个各个元素,而不暴露该对像的内部表示. 迭代器模式应该是最为熟悉的模式了,最简单的证明就是我在实现组合模式、享元模式、观察者模式中就直接用到了 STL 提供的迭代器来遍历 Vector 或者 List数据结构。

  • 本文向大家介绍详解设计模式中的中介者模式在C++编程中的运用,包括了详解设计模式中的中介者模式在C++编程中的运用的使用技巧和注意事项,需要的朋友参考一下 作用:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 结构图如下: Colleage抽象同事类,而ConcreteColleage是具体同时类,每个具体同事只知道自

  • 本文向大家介绍深入解析C++设计模式编程中解释器模式的运用,包括了深入解析C++设计模式编程中解释器模式的运用的使用技巧和注意事项,需要的朋友参考一下 解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语

  • 5. 生成器(Builder) Intent 封装一个对象的构造过程,并允许按步骤构造。 Class Diagram Implementation 以下是一个简易的 StringBuilder 实现,参考了 JDK 1.8 源码。 // java public class AbstractStringBuilder { protected char[] value; protec