zoukankan      html  css  js  c++  java
  • 设计模式——工厂模式(Factory)

    要想正确理解设计模式,首先必须明白它是为了解决什么问题而提出来的。

    设计模式学习笔记

    ——Shulin

    转载请注明出处:http://blog.csdn.net/zhshulin

    1、概念

               工厂模式定义:实例化对象,用工厂方法取代new操作。达到解耦的目的(避免硬编码耦合)。工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。


            工厂模式是我们最经常使用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统能够说是随处可见。由于工厂模式就相当于创建实例对象的new,我们经常要依据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,能否够考虑使用工厂模式,尽管这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的改动量


           经常使用的java ee框架:SpringSpring容器就是一个巨大的工厂


    2、目的

           解耦,使程序的扩展性更强。


    3、举例说明


            比方如今有2个工作AWorkBWork,以后可能很多其它。假设此时我们使用简单工厂方法,那么我们会设计一个WorkFactory然后实现一个静态方法,通过參数来控制生成哪个工作。看似简单工厂也能完毕任务,可是假设以后须要加上CWork,那么须要加入CWork实现类以及改动工厂方法,假设很多其它,那么会导致工厂类过于臃肿。由于简单工厂模式仅仅有一个工厂类,它须要处理全部的创建的逻辑。

     

            这时候就须要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责全部的对象的创建,而是将详细创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出详细工厂子类必须实现的接口,而不接触哪一个类应当被实例化这样的细节。

     

            这样的进一步抽象化的结果,使这样的工厂方法模式能够用来同意系统在不改动详细工厂角色的情况下引进新的产品,这一特点无疑使得工厂方法模式具有超过简单工厂模式的优越性。以下就针对以上需求设计UML图:




    从上图能够看出,这个使用的工厂方法模式的系统涉及到下面角色:

     

      抽象工厂(IWorkFactory)角色:担任这个角色的是工厂方法模式的核心,不论什么在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常用抽象类实现。

     

      详细工厂(AWorkFactoryBWorkFactory)角色:担任这个角色的是实现了抽象工厂接口的详细JAVA类。详细工厂角色含有与业务密切相关的逻辑,而且受到使用者的调用以创建工作类。

     

      抽象工作(IWork)角色:工厂方法模式所创建的对象的超类,也就是全部工作类的共同父类或共有的接口。在实际的系统中,这个角色也常用抽象类实现。

     

      详细工作(AWorkBWork)角色:这个角色实现了抽象(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();
    	}
    
    }

    client角色类源码:

    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,那么所须要的就是向系统中增加一个这个导类以及所相应的工厂类。没有必要改动client,也没有必要改动抽象工厂角色或者其它已有的详细工厂角色。对于增加新的导出类型而言,这个系统全然支持“开-闭原则”。


    (原文地址:http://blog.csdn.net/zhshulin/article/details/38339085
  • 相关阅读:
    三层架构补充
    复习三层架构
    复习DOM、JQuery
    复习HTML CSS JavaScript
    Git在新电脑拉github 上的项目
    超全的IE兼容性问题及解决方案
    JS操作iframe
    attachEvent和addEventListener
    HTTP 方法:GET 对比 POST
    原生JS+ CSS3创建loading加载动画;
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4003881.html
Copyright © 2011-2022 走看看