代码改变世界

工厂方法模式(Factory Method)

2011-09-25 07:45  javaspring  阅读(215)  评论(0编辑  收藏  举报

一、概要

        工厂方法(FactoryMethod)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。

 

二、生活中的例子

         例如移动电信运营商,不同的话费套餐形式,如动感地带,神州行,全球通等。我们可以把抽象工厂(套餐工厂)做成一个接口,这个接口只有一个方法,就是创建抽象产品(计费类)的工厂方法。然后所有的要生产具体类(动感地带,神州行等)的工厂去实现这个接口,由具体的套餐工厂去创建具体的套餐类。于是我们再增加新的套餐的时候,就不需要更改原有的工厂类,只需要增加此功能的计费类和相应的工厂类就可以了。

 

图示:


三、实现思路

         工厂方法模式是对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

 

四、类图


五、注意点

1、工厂方法模式克服了简单工厂模式违背开放—封闭原则的缺点,又保持了封装对象创建过程的优点

2、工厂方法模式每增加一个产品,就需要增加一个产品工厂的类,增加了额外的开发量。

3、工厂方法模式把简单工厂的内部逻辑判断(switch)判断移到了客户端代码进行,利用“反射”可以避免分支判断的问题,我们不在这里介绍。

4、工厂方法模式与简单工厂模式的区别

        (1)工厂方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。

  (2)工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。

  (3)当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。

 

 

六、实例

需求:实现上面二、生活中的例子。

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

namespace 工厂方法模式
{
    class Program
    {
        static void Main(string[] args)
        {
            //要改成其它套餐,修改这里即可
            IFactory factory = new DongGanDiDaiFactory();
            TaoCan DGDD = factory.CreateTaoCan();

            DGDD.Count();
        }
    }

    //套餐工厂
    interface IFactory
    {
        TaoCan CreateTaoCan();
    }

    //动感地带套餐工厂
    class DongGanDiDaiFactory : IFactory
    {
        public TaoCan CreateTaoCan()
        {
            return new DongGanDiDai();
        }
    }

    //神州行套餐工厂
    class ShenZhouXingFactory : IFactory
    {
        public TaoCan CreateTaoCan()
        {
            return new ShenZhouXing();
        }
    }

    //全球通套餐工厂
    class QuanQiuTongFactory : IFactory
    {
        public TaoCan CreateTaoCan()
        {
            return new QuanQiuTong();
        }
    }

    //套餐
    class TaoCan
    {
        public void Count()
        {
            Console.WriteLine("采用{0}方式计费",this.GetType().Name);
        }
    }

    //动感地带套餐
    class DongGanDiDai:TaoCan
    {
    }

    //神州行套餐
    class ShenZhouXing:TaoCan
    {
    }

    //全球通套餐
    class QuanQiuTong:TaoCan
    {
    }
}

如果要再添加其他套餐,只要添加相应的套餐工厂类和套餐类即可。

 

七、何时选用工厂方法模式

  建议在如下情况中,选用工厂方法模式:

         1、如果一个类需要创建某个接口的对象,但是又不知道具体的实现,这种情况可以选用工厂方法模式,把创建对象的工作延迟到子类去实现

         2、如果一个类本身就希望,由它的子类来创建所需的对象的时候,应该使用工厂方法模式

 

八、总结

         工厂方法(Factory Method)模式是设计模式中应用最为广泛的模式,它考虑到对象的创建时机问题,它提供了一种扩展的策略,很好地符合了开放封闭原则,以上通过对简单工厂和工厂方法模式的比较,以及理论加实例的介绍,简单说明了如何使用工厂。