版权声明:本文为博主原创文章,欢迎转载,请注明地址。
要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。
设计模式学习笔记
——Shulin
转载请注明出处:http://blog.csdn.net/zhshulin
1、概念
工厂模式定义:实例化对象,用工厂方法代替new操作。达到解耦的目的(避免硬编码耦合)。工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
常用的java ee框架:Spring,Spring容器就是一个巨大的工厂。
2、目的
解耦,使程序的扩展性更强。
3、举例说明
比如现在有2个工作AWork和BWork,以后可能更多。如果此时我们使用简单工厂方法,那么我们会设计一个WorkFactory然后实现一个静态方法,通过参数来控制生成哪个工作。看似简单工厂也能完成任务,但是如果以后需要加上CWork,那么需要添加CWork实现类以及修改工厂方法,如果更多,那么会导致工厂类过于臃肿。因为简单工厂模式只有一个工厂类,它需要处理所有的创建的逻辑。
这时候就需要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责所有的对象的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个类应当被实例化这种细节。
这种进一步抽象化的结果,使这种工厂方法模式可以用来允许系统在不修改具体工厂角色的情况下引进新的产品,这一特点无疑使得工厂方法模式具有超过简单工厂模式的优越性。下面就针对以上需求设计UML图:
从上图可以看出,这个使用的工厂方法模式的系统涉及到以下角色:
抽象工厂(IWorkFactory)角色:担任这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类实现。
具体工厂(AWorkFactory、BWorkFactory)角色:担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建工作类。
抽象工作(IWork)角色:工厂方法模式所创建的对象的超类,也就是所有工作类的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类实现。
具体工作(AWork和BWork)角色:这个角色实现了抽象(ExportFile)角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体工作角色的实例。
4、源代码
抽象工作类:
- public interface IWork {
- public void doWork();
- }
具体工作类:
- public class AWork implements IWork {
- @Override
- public void doWork() {
- System.out.println("做的是A工作!");
- }
- }
- public class BWork implements IWork {
- @Override
- public void doWork() {
- System.out.println("做的是B工作!");
- }
- }
- public interface IWorkFactory {
- public IWork createWork();
- }
具体工厂:
- public class AWorkFactory implements IWorkFactory {
- @Override
- public IWork createWork() {
- return new AWork();
- }
- }
- public class BWorkFactory implements IWorkFactory {
- @Override
- public IWork createWork() {
- return new BWork();
- }
- }
客户端角色类源代码:
- public class Test {
- public static void main(String[] args) {
- IWorkFactory aWorkFactory = new AWorkFactory();
- IWork aWork = aWorkFactory.createWork();
- aWork.doWork();
- IWorkFactory bWorkFactory = new BWorkFactory();
- IWork bWork = bWorkFactory.createWork();
- bWork.doWork();
- }
- }
5、工厂模式和简单工厂模式
工厂方法模式和简单工厂模式在结构上的不同很明显。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么不妨把抽象工厂类合并到具体工厂类中去。由于只有一个具体工厂类,所以不妨将工厂方法改为静态方法,这时候就得到了简单工厂模式。
如果系统需要加入一个新的工作CWork,那么所需要的就是向系统中加入一个这个导类以及所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的导出类型而言,这个系统完全支持“开-闭原则”。