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、可以使用在测试驱动开发的框架下。