C# 设计模式之生成器模式

原创 2007年09月24日 23:42:00
         我们一般为一个类提供构造函数,并利用这个构造函数完成对象的创建工作。当客户知道为哪个类创建实例,并知道构造函数的参数时(假设是用带参数的构造函数)。然而由于条件的现限制,是无法用通常的方式来构造对象的实例! 在进行对象构造之前,要逐步收集与构造相关的信息.那么创建对象的过程和对象的表现就应该分离开来。此时对象的表现是相对稳定的。

        应用场景是当创建一个复杂的对象时,这个对象由各个子对象构成,而由于需求的变化导致子对象的性质也是未确定的。

      
using System;
using System.Collections.Generic;
using System.Text;

namespace BuilderPattern
...{
    
/**//// <summary>
    
/// 所有课程
    
/// </summary>

    public class Coures
    
...{        
        
/**//// <summary>
        
/// 保存课程信息
        
/// </summary>

        IDictionary<stringdecimal> coures = new Dictionary<stringdecimal>();

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

    }

}

设计模式之生成器模式

将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示。应用场景:一水杯工厂要生产各式各样的水杯,无论杯子是神马造型,但都包括绳子,帽子和杯体。以此模型创建各种类型的杯子。类图 cu...
  • c275046758
  • c275046758
  • 2016年01月19日 10:27
  • 607

iOS设计模式之生成器

iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示 (2): 生成器模式除了客户之外还包含一个Director...
  • Judy_luo
  • Judy_luo
  • 2015年07月21日 13:55
  • 855

JAVA设计模式 — 生成器模式(Builder)

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 类型:对象创建型模式 类图: 四个要素 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,...
  • FX_SKY
  • FX_SKY
  • 2013年01月05日 16:08
  • 8282

Java设计模式--生成器模式

生成器模式将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。Builder PatternSeparate the construction of a complex objec...
  • bug_moving
  • bug_moving
  • 2016年09月25日 23:51
  • 1562

学习笔记:模式学习-生成器模式

前言 在前两讲,我们介绍了工厂方法和抽象工厂模式,这两种模式都是完成对一个或者若干个内部结构相对简单的对象的创建工作。换句话来说,这样的对象内部之间没有明显的子部分或者说是各个子部分间的“组装”过程...
  • qq_16956581
  • qq_16956581
  • 2015年11月17日 13:54
  • 449

快速开发之代码生成器(asp.net mvc4 + easyui + knockoutjs)

一、前言 作为一个码农这么多年,一直在想怎么提高我们的编码效率,关于如何提高编码效率,我自己的几点体会 1、清晰的项目结构,要编写代码的地方集中 2、实现相同功能的代码量少并且清晰易懂 3、重复或...
  • kingmax54212008
  • kingmax54212008
  • 2015年10月17日 22:28
  • 3403

C#生成器模式实现

转自:http://blog.sina.com.cn/s/blog_9d35598f0100zob1.html 生成器模式:  它将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。...
  • yiyunhzy
  • yiyunhzy
  • 2013年03月20日 14:11
  • 433

.net代码生成器大全

1:CodeSmith       一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http://forum.c...
  • guozh
  • guozh
  • 2015年04月06日 11:06
  • 3708

生成器模式及C++代码实现

生成器模式:生成器顾名思义就是生成对象的一种工具(器械),不过它和工厂模式不一样,生成器模式强调一步一步创建对象,并通过相同的创建过程可以获得不同结果的对象(这一点在具体实现中用多态),将对象的创建过...
  • u012395430
  • u012395430
  • 2014年04月20日 21:26
  • 770

PHP设计模式——建造者模式

声明:本系列博客参考资料《大话设计模式》,作者程杰。        建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为...
  • jhq0113
  • jhq0113
  • 2015年04月25日 11:30
  • 2557
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 设计模式之生成器模式
举报原因:
原因补充:

(最多只允许输入30个字)