zoukankan      html  css  js  c++  java
  • java设计模式之工厂方法模式

      上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包-开放原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

    工厂方法模式的概念

         工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品(百度百科)

    工厂方法模式的UML图

      

      我特意去阅读了《大话设计模式》《设计模式之禅》,把类图在补充一下:当抽象工厂只有一个产品,变为工厂方法模式,当产品多个时候变为抽象工厂模式

      这里在放2张简单工厂和工厂方法模式的图,形成对比:

    工厂方法模式的代码

      我们接着简单工厂模式的例子继续讲解工厂方法模式,如果在简单工厂模式中需要增加一种不男不女的人,就需要修改工厂类中的生成方法了,虽然可以实现我们需要的结果,但是违背了java的开放-闭包的原则。我们根据前面的例子做一改造。

    /**
     * This is factory patter package
     */
    package com.roc.factory;
    
    /**
     * 产品的抽象接口  人类
     * @author liaowp
     *
     */
    public interface Human {
        
        public void say();
    
    }
    /**
     * This is factory patter package
     */
    package com.roc.factory;
    
    /**
     * man  男人
     * @author liaowp
     *
     */
    public class Man implements Human {
    
        /* say method
         * @see com.roc.factory.Human#say()
         */
        @Override
        public void say() {
            System.out.println("男人");
        }
    
    }
    /**
     * This is factory patter package
     */
    package com.roc.factory;
    
    /**女人
     * @author liaowp
     *
     */
    public class Woman implements Human {
    
        /* say method
         * @see com.roc.factory.Human#say()
         */
        @Override
        public void say() {
            System.out.println("女人");
        }
    
    }

    前面的代码是一样的,现在我们需要为一种人创建一个工厂类,既然每一个人都有自己的工厂类,那是不是可以抽一个类呢,对的,我们就抽出一个工厂接口来。

    package com.roc.factory;
    /**
     * 工厂接口类
     * @author liaowp
     *
     */
    public interface Factory {
        
        public Human crateMan();
        
    }

    创造男人的工厂类

    package com.roc.factory;
    /**
     * 创造男人工厂类
     * @author liaowp
     *
     */
    public class ManFactory implements Factory{
    
        public Human crateMan() {
            return new Man();
        }
    
    }

    创造女人的工厂类

    package com.roc.factory;
    /**
     * 创造女人工厂类
     * @author liaowp
     *
     */
    public class WomanFactory implements Factory{
    
        @Override
        public Human crateMan() {
            // TODO Auto-generated method stub
            return new Woman();
        }
    
    }

    客户端类

    package com.roc.factory;
    /**
     * 抽象工厂测试
     * @author liaowp
     *
     */
    public class Client {
        public static void main(String[] args) {    
            Factory factory=new ManFactory();
            Human  man2=factory.crateMan();
            man2.say();
            
        }
    }

      改造完成,经过我这么一改造,你现在知道怎么增加创造不男不女的人吗?这样一改造你需要增加任何的类型都只需要增加一个工厂类,一个产品类。然后在客户端写出新的调用。完全符合了java的开发与闭包原则。

    应用场景  

      第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
      第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
  • 相关阅读:
    插入排序
    JavaMail学习笔记
    Struts2的工作原理
    我的快速排序
    截取字符串,只截取前N个字节的字符
    修改MyEclipse8.6中的Servlet.java模板
    Java类装载的过程及原理介绍
    cmd检查jdk的版本
    快速排序
    flash 侦测人的面部
  • 原文地址:https://www.cnblogs.com/liaoweipeng/p/5768303.html
Copyright © 2011-2022 走看看