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

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

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

复制代码
代码
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();
        }
    }
}
复制代码

 

运行就会输出:

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

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

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值