浅析设计模式系列之三--工厂方法模式

基本简介

  从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。 

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

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

 

意图:
提供一个类,由它负责根据一定的条件创建某一具体类的实例。

 

该模式中包含的角色及其职责

1)      抽象工厂(Creator)角色

是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

2)      具体工厂(Concrete Product)角色

   实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

3)      抽象产品(Product)角色

  简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

4)      具体产品(Concrete Product)角色

     简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。 一般来讲它是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。

 

UML图:

 

例子:

实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。

 

分析:还是上一章的例子,只是将将工厂分为抽象工厂和具体工厂。简单起见,只列出了加法和减法。

 

抽象产品类代码:

  

 

具体产品类代码:

 

 

 

抽象工厂类代码:

 

 

具体工厂类代码:

 

 

 

 

客户端调用代码:

 

在这里,有朋友肯定发现了这样的问题:简单工厂方法中,我们是在工厂内部选择具体的产品类,但到了工厂方法模式中,我们却需要改变客户端代码来选择工厂。为了解决这个问题,我们引入反射+配置还更改我们的程序。

添加一个App.config文件:

 

客户端代码:

       这样,我们就只需要去更改配置文件里的信息,就能选择不同的工厂,代码的耦合进一步降低了。

实现要点

1.  Factory Method模式的两种情况:一是Creator类是一个抽象类且它不提供它所声明的工厂方法的实现;二是Creator是一个具体的类且它提供一个工厂方法的缺省实现。

2.  工厂方法是可以带参数的。

3.  工厂的作用并不仅仅只是创建一个对象,它还可以做对象的初始化,参数的设置等。

 

效果

1.  用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。

2.  Factory Method模式通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。

 

适用性

在以下情况下,适用于工厂方法模式:

1.当一个类不知道它所必须创建的对象的类的时候。

2.当一个类希望由它的子类来指定它所创建的对象的时候。

3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

 

总结

      Factory Method模式是设计模式中应用最为广泛的模式,通过本文,相信读者已经对它有了一定的认识。然而我们要明确的是:在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。Factory Method要解决的就是对象的创建时机问题,它提供了一种扩展的策略,很好地符合了开放封闭原则。

参考资料:

   《大话设计模式》 程杰 清华大学出版社

 

 

posted on 2012-08-10 21:28  好坏  阅读(571)  评论(0编辑  收藏  举报

导航