标签:
上一篇文章(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的开发与闭包原则。
应用场景
标签:
原文地址:http://www.cnblogs.com/liaoweipeng/p/5768303.html