[导读]

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

[设计模式整理笔记 二] 简单工厂模式(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();
        }
    }
}

 

运行就会输出:

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

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

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

 

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

posted on 2010-01-14 09:06  风浪  阅读(2053)  评论(11编辑  收藏  举报