小菜学设计模式——抽象工厂模式

背景

简单工厂、工厂方法模式,接着必须学习抽象工厂模式

1、使用意图

扩展工厂方法模式

2、生活实例

淘宝电影、猫眼电影都能为我们生成当天各种电影票

3、Java 例子(框架、JDK 、JEE)

个人觉得实实在在的根据抽象工厂模式定义的类应该会很少,毕竟不方便扩展,虽然它是一种很了不起的思想。一般都会采用反射机制+抽象工厂完成,比如,JDBC模块,在使用DriverManger.getConnection 这一步之前,必须要先加载驱动,也就是 Class.forname(class);这里指定class,通过这一步就可以创建驱动实例,也就是通过反射和工厂模式为应用注入了对象;Spring 核心之一 IoC 采用的也是反射机制+工厂模式来完成。

4、模式类图

5、模式优点

抽象工厂模式:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们的具体类。

最大的优点是:容易交换产品系列,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,他只需要改变具体工厂即可使用不同的产品配置。

其次,他让具体创建实例过程与客户端分离,客户端是通过他们的抽象接口操作实例,产品的具体类别也被具体工厂实现分离,不出现在客户端代码中。

6、与类似模式比较

我们知道简单工厂模式(静态工厂模式)就是简单的把对象的创建过程移到了工厂当中,通过对客户端传入的参数flag进行判断生成对应的product对象;具体类图如下:

这个模式最大的优点是把对象生成的复杂逻辑与客户端进行分离,这些逻辑判断通通交给了工厂,所以缺点也很明显,只要新增一种产品,他就需要修改工厂里面的逻辑判断;

接着,工厂方法模式则是简单工厂模式的一种改进,他把生成对象的逻辑判断移到客户端,有客户端自己来决定初始化哪个需要的类,那么,当你需要新增一种产品时,只需要新增一个工厂类,就可以达到目的,这样克服了简单工厂模式违背的开放封闭原则。具体类图如下:

当你需要,新增一种产品时,就可以通过新增一个ConcreteFactory类实例化一个ConcreteProduct,客户端则更具自己需要来选择具体的ConcreteFactory。相比简单工厂,可以这么说,工厂方法模式其实就是增加了工厂。

然后,就是抽象工厂模式,抽象工厂模式是在专门的条件下生成,比较简单工厂和工厂模式可以知道,他们生产的对象都有一个共同点,那就是生产的对象都是Product的子类,这些对象都是一类产品。可是如果我还想生成不是Product子类的产品怎么办呢?那么,抽象工厂模式就是在工厂方法模式上扩展,把createProduct新增扩展为CreateProductA和CreateProductB,甚至更多!就可以生成ProductA的子类,也可以生成ProductB的子类了。因为ProductA的子类可能有很多,所以 ConcreteFactory也就会有很多,而且ProductA和ProductB一般都是同属一个家族。最后,你发现如果需要新增ProductC时,这个扩展起来可真不容易........

最后,抽象工厂模式就是工厂方法模式的扩展,工厂方法模式就是简单工厂的改进。

本文参考:

http://my.oschina.net/sunchp/blog/363483

时间: 2024-11-10 13:24:04

小菜学设计模式——抽象工厂模式的相关文章

小菜学设计模式——简单工厂模式

背景 很多时候我们不知道客户具体需要执行哪种类型的操作,但是客户会给出我们对应的提示信息,那么我们的程序必须能够根据参数信息进行动态操作,这样的程序才是一个可扩展的程序.简单工厂模式应该是我们最常见的一种设计模式之一,他就是根据客户的意图选择对应的执行类型进行操作,实际上就是根据不同的参数实例化出不同的对象,所以叫做工厂. 1.使用意图 根据参数的不同实例化出对应的类型对象,对于那些需要大量 生成相同父类实例的程序,他可以避免了代码的重复. 2.生活实例 生活处处是例子 3.Java 例子(框架

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

设计模式——抽象工厂模式学习

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

Java研究之学习设计模式-抽象工厂模式详解

 简介:          当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产[1] 品角色都有两个具体产品.抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化.每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例. 每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.(摘自百度百科) 话语说得太抽象,程序员最好的表示方式

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 參考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不须要明白指定详细类. 所有代码: http://download.csdn.net/

Android设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

php设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——抽象工厂模式(Abstract Factory) 4 */ 5 6 7 /* 8 * I

5. 星际争霸之php设计模式--抽象工厂模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248178.html============================================