第0章:简介
简单工厂模式定义:提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类或具体类
简单工厂模式的实质:选择实现
参考:http://chjavach.iteye.com/blog/800325 ,研磨设计模式(书籍),大话设计模式(书籍)
模式图:
待补充
第1章:实践
(1)接口类(Intf.java)
package com.mcc.core.designPattern.build.simpleFactory; /** * 接口 * * @author menergy * DateTime: 14-3-9 上午12:24 */ public interface Intf { public void someMethod(); } |
(2)实现类A(IntfImplA.java)
package com.mcc.core.designPattern.build.simpleFactory; /** * 实现类A * * @author menergy * DateTime: 14-3-9 上午12:28 */ public class IntfImplA implements Intf { @Override public void someMethod() { System.out.println("实现类A"); } } |
(3)实现类B(IntfImplB.java)
package com.mcc.core.designPattern.build.simpleFactory; /** * 实现类B * * @author menergy * DateTime: 14-3-9 上午12:28 */ public class IntfImplB implements Intf { @Override public void someMethod() { System.out.println("实现类B"); } } |
(4)简单工厂类(Factory.java)
package com.mcc.core.designPattern.build.simpleFactory; /** * 简单工厂 * * 简单工厂模式定义:提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类或具体类 * 简单工厂模式的实质:选择实现 * * @author menergy * DateTime: 14-3-9 上午12:18 */ public class Factory { /** * 创建对象的方法 * @param implType 实体标识 * @return */ public static Intf create(int implType){ Intf intf = null; if(implType == 1){ intf = new IntfImplA(); }else if(implType == 2){ intf = new IntfImplB(); } return intf; } } |
(5)客户端测试类(Client.java)
package com.mcc.core.designPattern.build.simpleFactory; /** * 客户端测试 * * @author menergy * DateTime: 14-3-9 上午12:39 */ public class Client { public static void main(String args[]){ //工厂生产A对象 Intf intfA = Factory.create(1); intfA.someMethod(); //工厂生产B对象 Intf intfB = Factory.create(2); intfB.someMethod(); } } |
思考:
设计模式的六大原则是很好的分析设计模式优劣的标准。先看一下六大设计模式。
这里主要思考该模式是否可以适应开闭原则(OCP),开闭原则即是对扩展开发,对修改关闭。假设我们的业务需要新增一个类产品,即是上面例子中增加一个实现类C,如下:
package com.mcc.core.designPattern.build.simpleFactory; /** * 实现类C * * @author menergy * DateTime: 14-3-9 上午12:28 */ public class IntfImplC implements Intf { @Override public void someMethod() { System.out.println("实现类C"); } } |
接口扩展很方便,但是我们需要修改工厂类去新增实体C的实例化,这样就违背了开闭原则的对修改关闭。需要修改如下:
package com.mcc.core.designPattern.build.simpleFactory; 这里是新增的修改,违背了OCP原则 |
而且,如果随着业务的实现,实体类扩展越多,工厂中就需要增加更多的实例化过程,这样工厂会越来越臃肿,所以简单工厂比较适用于业务上确定种类不多扩展不多的情况。如果不能确定不在扩展,需要找到更好的模式,解决方法将会在工厂方法模式和抽象工厂模式中将会进一步讨论。
---------------------------------------------------------------------------------------------------------------------------------
再思考:
在上面的普通工厂方法模式中,我们采用客户端传递参数的方式调用工厂选择实例化哪个实体,如果传递的类型出错,则不能正确创建对象。我们改为在工厂中采用方法代替参数的方式来简单改进这个问题,如下:
package com.mcc.core.designPattern.build.simpleFactory; /** |
采用多方法简单工厂模式后,可以避免传参的问题,但违背开闭原则(OCP)的问题依然没有解决,接下来的文章中将看到工厂方法模式可以解决这个问题。其实工厂方法模式就是把多方法简单工厂模式的每个具体实例化方法单独出来,放在独立的工厂类中,然后这些工厂类都统一继承一个抽象的工厂接口或者工厂抽象类。具体模式在工厂方法模式文章中阐述。