1、问题场景
场景:为了高内聚、低耦合,我们经常抽象一些公共的接口形成基类或者接口。这样我们可以通过基类指针指向实现了virtual方法的子类,实现动态绑定。
问题: (1)、复杂的系统中,子类命名会成为一个头疼的问题,因为当父类指向子类的时候需要确切的知道子类的实例对象;程序的扩展性会变差,维护也变得困难。
(2)、父类有时候并不知道具体要实例的哪一个具体的子类。
2、解决办法
工厂模式:定义创建对象的接口,封装了对实例的创建;同时具体类的实例工作延迟到子类中完成。其中工厂模式有三种模型组成:简单工厂(Simple Factory)、工厂方法(Factory Method)以及抽象工厂(Abstract Factory)。
2.1、简单工厂(Simple Factory)
简 述:简单工厂又名静态工厂方法,它的表现形式:定义一个能够创建对象指定具体实例的接口(static 方法)。
UML图:
优缺点:开闭原则(对扩展开发、对修改封闭);当有新产品加入时,简单工厂很被动(直观地说就是要在原来的方法中新增更多的业务逻辑判断)。
2.2、工厂方法(Factory Method)
简 述:工厂方法去掉了简单工厂的静态方法,它的表现形式:抽象创建实例方法(virtual 方法)。
UML图:
优缺点:当产品类型单一,但是呈树形增长时,工厂方法可以很好的解决工厂对应的产品的关系;当产品数量的增长伴随着产品的分类,虽然不用像简单工厂那样更改原有代码,但是增加了工厂类的维护难度。
2.3、抽象工厂(Abstract Factory)
简 述:抽象工厂与工厂方法相比,复杂程度上呈几何增长,但是它能很好的解决多产品的树形增长,它的常表现形式与工厂方法类似,但又有区别。要想使用抽象工厂必须满足的条件:
1、系统中有多个产品系列,而且客户一次消费一个系类的产品;
2、同属于同一系列的产品供其使用。
UML图:
优缺点:很好地解决了多系列产品的实例创建;由于抽象工厂使用的继承与多态,会增加后期对工厂类的维护成本。
---------------------------------------------------------------------------
Name:一个奔跑中的loser
E-mail:chenfeiyoucan@163.com
_________________________________________