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

    }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

工厂模式一般都是根据传递给创建方法的参数来返回不同的几个子类的一个,不过如果我们需要的不仅仅是一个算法,还需要显示数据,不同的子类要有不同的显示数据方法,需要一个完全不同的用户界面,这样我们就可能需要...

设计模式讲解与代码实践(二)——生成器

本文讲解了生成器(Builder)设计模式的使用目的、基本形态、各参与者以及调用时序,并结合示例代码,讲解了该设计模式在具体业务场景下的使用。

设计模式 - 生成器 Builder

1. 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 2.适用性 在以下情况使用Builder模式 当创建复杂对象的算法应该独立与该对象的组成部分及他...

设计模式(三) 生成器(Builder)

1.定义 生成器是一种对象创建型的模式。生成器将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。 2.适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式...

设计模式---生成器(Builder)

目的:在软件开发的过程中不可避免地会碰到一些复杂的对象。如果直接去创建这些复杂的对象,会使代码变得难于理解和维护,而且对于大多数用户而言他们并不关心对象各个成员的创建过程。Builder的作用就是将对...

C++设计模式-生成器

定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 结构 理解 1. 生成器(Builder)模式是一步步构建一个复杂的产品,它允许用户可以只通过...

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

Builder解决的问题 Builder(生成器)的模式用于用多个部件生成不同产品的问题: Builder模式适用于: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时 当构...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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