服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 详解C#设计模式编程中生成器模式的使用

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

2021-11-14 13:28scucj C#

这篇文章主要介绍了详解C#设计模式编程中生成器模式的使用,生成器模式主张创建对象的过程和对象的表现应该分离开来,需要的朋友可以参考下

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

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

  • Builder为创建Product对象的各个子对象指定抽象接口。
  • ConcreteBuilder实现了Builder接口,用于创建Product对象的各个子对象。
  • Director使用Builder来创建Product对象。
  • Product表示被构造的复杂对象。


三、示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
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#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16