zoukankan      html  css  js  c++  java
  • [设计模式整理笔记 五] 创建者模式(Builder)

    [导读]

    [设计模式整理笔记 一] 基础知识

    [设计模式整理笔记 二] 简单工厂模式(Simple Factory)

    [设计模式整理笔记 三] 工厂模式(Factory)

    [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)

    [设计模式整理笔记 五] 创建者模式(Builder)

    [设计模式整理笔记 六] 工厂模式与创建者模式总结

    [设计模式整理笔记 七] 原型模式(ProtoType)

    [设计模式整理笔记 八] 单例模式(Singleton)

    [设计模式整理笔记 九] 外观模式(Facade)

    ....后续, 包括部分例子

    [/导读]

    在简单工厂模式里面,我们只需编写一个工厂类专门来实例化你需要的类。在工厂模式中, 我们系统中有几个不同的产品, 我们就写几个对应的工厂类来进行生产,等于现在的车间, 不是车间实例化不同的类, 就是某些产品极为相近,都需要写二个工厂类来生产并返回你需要的类。抽象工厂模式中,我们会把一系列相似的产品放在一个工厂类里面实例化,和现在车间的流水线差不多,一个流水线负责生产相似的产品, 不同的产品需要另一条流水线来生产。工厂模式是针对细微的产品来创工厂类, 像个人实得工资计算过程中, 还需要计算税, 基金等操作, 如果用工厂模式来设计,那会变得好复杂, 那么怎样才能设计出更好的方式来处理这个问题呢? 下面就用创建者模式来介绍,具体介绍深圳子公司计算的全过程:

    既然是深圳子公司,那就先创建这个子公司的类先:

    代码
    using System;

    namespace ConsoleApp
    {
       
    public class ShenZhenCompany
        {
           
    public virtual void CommandSalary()
           {
               Console.WriteLine(
    "这是深圳子公司系统计算的结果");
           }
        }
    }

    既然要进行三个流程的计算,下面定义三个计算的类, 分别是工资,税,基金:

    工资部分:

    代码
    //定义接口方法
    namespace ConsoleApp
    {
        
    public interface ISalary
        {
            
    void CommandSalary();
        }
    }

    //定义类
    namespace ConsoleApp
    {
        
    public class ShenZhenSalary : ISalary
        {
            
    public virtual void CommandSalary()
            {
                Console.WriteLine(
    "这是深圳子公司的工资计算模块");
            }
        }
    }

    税定义如下:

    代码
    //定义接口方法
    namespace ConsoleApp
    {
        
    public interface ITax
        {
            
    void CommandTax();
        }
    }

    //定义类
    namespace ConsoleApp
    {
        
    public class ShenZhenTax: ITax
        {
            
    public void CommandTax()
            {
                Console.WriteLine(
    "这是深圳子公司的扣税计算模块");
            }
        }
    }

    基金定义如下:

    代码
    //定义接口如下
    namespace ConsoleApp
    {
        
    public interface IFund
        {
            
    void CommandFund();
        }
    }
    //定义类
    namespace ConsoleApp
    {
        
    public class ShenZhenFund : IFund
        {
            
    public void CommandFund()
            {
                Console.WriteLine(
    "这是深圳子公司的基金计算模块");
            }


        }
    }

    到这里基本上的类都定义完成, 一般的时候, 我们需要用时直接实例化就可以了, 然而你知道设计一个好的调用方法会帮助日后更好维护,相信也不会要用的时候直接实例化一个对象了。先定义一个抽象工厂类(IFactory)

    namespace ConsoleApp
    {
        
    public interface IFactory
        {
            ISalary CreateSalary();
            ITax CreateTax();
            IFund CreateFund();
        }
    }

    那现在就可以创建一个类, 这个是派生于IFactory的, 我定义其名为ShenZhenFactory,在这个类里面, 是返回三个操作流程的类:

    代码
    namespace ConsoleApp
    {
        
    public class ShenZhenFactory : IFactory
        {
            
    public ISalary CreateSalary()
            {
                
    return new ShenZhenSalary();
            }

            
    public ITax CreateTax()
            {
                
    return new ShenZhenTax();
            }

            
    public IFund CreateFund()
            {
                
    return new ShenZhenFund();
            }
        }
    }

    到这里你就知道这个类的作用了吧, 每一个对应的方法返回对应的类, 那么我们只需要再创建一个类的对他们进行组装就可以了。客户端不需要再需要各种过程,所有的过程都封装在相应的类里面,职责十分明了。

    代码
    namespace ConsoleApp
    {
        
    public class Director
        {
            
    private IFactory Factory;

            
    public Director(IFactory Factory)
            {
                
    this.Factory = Factory;
            }

            
    public ShenZhenCompany AssembleShenZhenCompany()
            {
                ISalary Salary 
    = Factory.CreateSalary();
                Salary.CommandSalary();   
    //工资计算

                ITax Tax 
    = Factory.CreateTax();
                Tax.CommandTax();   
    //税计算

                IFund Fund 
    = Factory.CreateFund();
                Fund.CommandFund();  
    //计算基金

                
    return new ShenZhenCompany();
            }

        }
    }

    整个流程都在我们的掌控之中了, 下面就是调用了,代码如下:

    代码
    namespace ConsoleApp
    {
        
    class Program
        {
            
    public static void Main(string[] args)
            {
                Director MyDirector 
    = new Director(new ShenZhenFactory());
                ShenZhenCompany SZCompany 
    = MyDirector.AssembleShenZhenCompany();         
                Console.ReadLine();
            }
        }
    }

    运行就会输出:

    这是深圳子公司的工资计算模块

    这是深圳子公司的扣税计算模块

    这是深圳子公司的基金计算模块

    到这里为止, 一个完整的流程出来了, 当然你可以按工资计算模块那样, 用工厂模式把扣税或基金模块的代码也写出来,当练习一下, 现在知道什么时候应该用工厂模式,什么时候用创建者模式了吧! 后面一章, 会用好典型的例子来讲解一下简单工厂模式,工厂模式,抽象工厂模式,创建者模式的特点。 保证你一看完就印象深刻。

  • 相关阅读:
    I
    D
    K
    G
    J
    Doom HDU
    Mountaineers Gym
    华南理工大学“三七互娱杯”程序设计竞赛(重现赛)( HRY and array 高精度除法模板)
    Corn Fields POJ
    linux如何安装缺失依赖
  • 原文地址:https://www.cnblogs.com/whtydn/p/1645268.html
Copyright © 2011-2022 走看看