详解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#教程
本文标题:详解C#设计模式编程中生成器模式的使用
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/6675.html
您可能感兴趣的文章
- 01-10C#编程实现自定义热键的方法
- 01-10C#编程获取资源文件中图片的方法
- 01-10深入浅出23种设计模式
- 01-10C#中Socket通信用法实例详解
- 01-10C#编程自学之数据类型和变量二
- 01-10C#编程自学之开篇介绍
- 01-10C#编程自学之数据类型和变量三
- 01-10C#编程自学之运算符和表达式
- 01-10C#装箱和拆箱原理详解
- 01-10C#编程自学之类和对象
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 01-10C#中split用法实例总结
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-11ajax实现页面的局部加载
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法
- 04-02jquery与jsp,用jquery
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置