设计模式之工厂方法模式

来源:互联网 发布:淘宝怎么样找货源 编辑:程序博客网 时间:2024/06/05 04:08

上一篇中记录了简单工厂模式,该模式由一个工厂负责创建不同的类,这些不同的类都继承自同一个基类,或者实现相同的接口,例如加减乘除四种运算,使用简单工厂模式创建不同的类,对应的UML类图如下所示:


如果要增加一个开平方的运算呢?在简单工厂模式的基础上,我们需要增加一个开平方的类,继承上图中的运算类,然后修改简单工厂类中的代码,使简单工厂可以根据传入的参数,生成一个开平方运算类的对象,但是这样的修改明显违反了设计模式六大原则之一:开放封闭原则。该原则的思想是,对扩展开发,对修改封闭。为了解决简单工厂模式中的这个问题,工厂方法模式应运而生,工厂方法有别于简单工厂的地方是,工厂方法将工厂抽象出来,对于每个运算类,都有对应的工厂去生产它,而不是将生产放到一个工厂里,工厂方法模式的UML类图如下所示:


一、模式动机

简单工厂模式如果需要增加新类型,那么需要修改工厂类的代码,这就使得整个设计在一定程度上违反了“开放封闭原则”。我们定义一个抽象的工厂类,而定义具体的工厂类来实现这个抽象按钮工厂类中定义的方法。抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品。这一特点使得工厂方法模式具有超越简单工厂模式的优越性。

二、模式定义

工厂方法模式(Factory Method Pattern):工厂方法模式又简称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态模式,属于类的创建型模式。在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建) 哪一个类。

三、模式结构


四、模式使用

这里还是用运算的例子来演示工厂方法模式的使用,对于四个不同的运算类(加减乘除),他们有共同的基类Operation,对于生产这四个不同的运算类的工厂,他们实现了共同的接口IFactory,该接口里声明了一个createOperation()的方法,返回值为Operation类型,对于AddOperation、SubOperation、MulOperation、DivOperation,分别有四个工厂AddFactory、SubFactory、MulFactory、DivFactory与之对应,这四个工厂生产对应的运算类,代码就不贴出来了。

五、工厂方法模式的优缺点

优点:

在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类被实例化这一细节,用户只需要关心所需产品对应的工厂,无需关心创建产品的细节,甚至无需知道产品类的类名。
基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
使用工厂方法模式的另一个优点是在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其它的具体工厂和具体产品,而只要添加一个新的具体工厂和具体产品即可。

缺点:

在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,类成对增加,将导致系统设计较为庞大,且运行时系统会有额外的开销。
由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现的时候可能需要用到反射等技术,增加了系统的实现难度。


0 0