码迷,mamicode.com
首页 > 编程语言 > 详细

java设计模式之抽象工厂模式

时间:2016-08-13 16:52:57      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

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

抽象工厂模式的概念

  抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。(百度百科)

抽象工厂模式的UML图

  技术分享

抽象工厂模式的代码

  我们接着简单工厂模式的例子继续讲解抽象工厂模式,如果在简单工厂模式中需要增加一种不男不女的人,就需要修改工厂类中的生成方法了,虽然可以实现我们需要的结果,但是违背了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() 方法即属于这种情况。
  第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。

 

java设计模式之抽象工厂模式

标签:

原文地址:http://www.cnblogs.com/liaoweipeng/p/5768303.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!