Factory Method(工厂模式):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
类型:创建型模式
类图:
使用方法:
抽象产品类
public abstract class Product { /** * 产品公共方法 */ public void method1() { // 业务逻辑处理 } /** * 抽象方法 */ public abstract void method2(); }
具体产品类1
public class ConcreteProduct1 extends Product { @Override public void method2() { // 业务逻辑处理 } }
具体产品类2
public class ConcreteProduct2 extends Product { @Override public void method2() { // 业务逻辑处理 } }
抽象工厂类
public abstract class Creator { /** * 创建一个产品对象,输入参数类型可以自行设置,通常为String,Enum,Class等,也可为空 * * @param c 类的字字码对象 * @param <T> 参数化类型 * @return 类的一个实例 */ public abstract <T extends Product> T createProduct(Class<T> c); }
具体工厂类
public class ConcreteCreator extends Creator { @Override public <T extends Product> T createProduct(Class<T> c) { Product product = null; try { product = (Product) Class.forName(c.getName()).newInstance(); } catch (Exception e) { // 异常处理 } return (T) product; } }
场景类
public class Client { public static void main(String[] args) { Creator creator = new ConcreteCreator(); Product product1 = creator.createProduct(ConcreteProduct1.class); Product product2 = creator.createProduct(ConcreteProduct2.class); } }
优点:
1、良好的封装性,代码结构清晰。
2、工厂方法模式的扩展性非常优秀。
3、屏蔽产品类,产品类的实现如何变化,调用者不需要关心,它只需要关心产品的接口,接口保持不变,系统中的上层模块就不要发生变化。
4、经典的解耦框架,高层模块只需要知道产品的抽象类,其它的实现都不用关心,符合迪米特法则。
使用场景:
1、是new一个方法的替代品,在所胡需要生成对象的地方都可以使用。
2、需要灵活的、可扩展的框架时。
3、可以用在异构的项目中。
4、可以使用在测试驱动开发的框架下。