1、引言编程
上一篇介绍了最基本的简单工厂模式,其中提到:简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,如此会形成简单工厂的实现逻辑过于复杂,本文介绍的工厂模式能够有效的解决此问题。ide
2、定义:spa
工厂模式:定义一个用于建立对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。设计
工厂模式实现时,客户端须要决定实例化哪个工厂类实现运算类,选择判断的问题仍是存在的,即:工厂方法把简单工厂的内部逻辑判断转移到了客户端来进行。若是须要增长功能,则修改客户端。3d
3、UML图代理
角色: code
抽象工厂Creator:声明工厂方法,返回一个产品。 对象
具体工厂角色ConcreteCreator:实现生成具体产品的方法,返回一个具体产品。blog
抽象产品角色Product:上述全部类的父类或者是接口。接口
具体产品角色Concrete Product:由工厂类建立出来的具体的产品实例。
UML图:
4、举例说明:
在简单工厂模式中用实现加减乘除的实例进行具体说明,本节将继续使用此例说明工厂模式。
抽象产品:
public class Operation { private double numberA = 0; private double numberB = 0; public double NumberA { get { return numberA; } set { numberA = value; } } public double NumberB { get { return numberB; } set { numberB = value; } } public virtual double GetResult() { double result = 0; return result; } }
具体产品:
class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } class OperationSub : Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } class OperationMul : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } class OperationDiv : Operation { public override double GetResult() { double result = 0; if (NumberB == 0) { throw new Exception("除数不能为0"); } result = NumberA / NumberB; return result; } }
抽象工厂:
interface IFactory { Operation CreateOperation(); }
具体工厂:
class AddFactory : IFactory { public Operation CreateOperation() { return new OperationAdd(); } } class SubFactory : IFactory { public Operation CreateOperation() { return new OperationSub(); } } class MulFactory : IFactory { public Operation CreateOperation() { return new OperationMul(); } } class DivFactory : IFactory { public Operation CreateOperation() { return new OperationDiv(); } }
客户端调用:
static void Main(string[] args) { IFactory operFactory = new AddFactory(); Operation oper = operFactory.CreateOperation(); oper.NumberA = 3; oper.NumberB = 7; double result = oper.GetResult(); Console.WriteLine(result); }
5、优缺点及适用场合
优势:
1)基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它可以使工厂能够自主肯定建立何种产品对象。并且如何建立一个具体产品的细节彻底封装在具体工厂内部,符合高内聚,低耦合。
2)在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其余的具体工厂和具体产品,很好的利用了封装和委托。
缺点:
添加新的功能产品时,须要编写新的具体产品类,并增长相应的具体工厂类。
应用场景:
1)类不知道须要建立什么对象,由客户端决定须要建立对象时。
2)当类将建立对象的职责委托给多个子类中的一个,而且但愿子类是代理这一这一信息局部化的时候。(摘抄,不是很明白这一点)
6、总结
工厂模式经过面向对象编程中的多态性将对象的建立延迟到具体的工厂中,从而解决了简单工厂模式中存在的问题,同时遵循设计原则:对扩展开放,对修改关闭。