一、介绍
-
定义一个用于创建对象的 接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类
-
工厂方法模式属于创建型模式,是工厂模式的一种
-
工厂方法模式是对简单工厂模式的抽象升级,将工厂这个概念抽象出来成为接口或抽象类,然后针对每种目标实现类创建一个工厂实现,一对一来实现,当新增了目标实现,只要同时新增一个工厂实现即可。
二、实现
在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;
Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成;
1、工厂方法实现
Ⅰ、代码
// 抽象产品
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等,当然也可以为空
*/
public abstract <T extends Product> T createProduct(Class<T> c);
}
// 具体工厂类
public class ConcreteCreator extends Creator {
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 product = creator.createProduct(ConcreteProduct1.class);
}
}
// 多工厂模式的抽象工厂类
public abstract class Creator {
public abstract Product createProduct();
}
// 产品1具体工厂
public class ConcreteCreator1 extends Creator {
public Product createProduct() {
return new ConcreteProduct1();
}
}
// 产品2具体工厂
public class ConcreteCreator2 extends Creator {
public Product createProduct() {
return new ConcreteProduct2();
}
}
public class Client {
public static void main(String[] args) {
Creator creator = new ConcreteCreator1();
Product product = creator.createProduct();
}
}
Ⅱ、优点
- 目标可以无限扩展,工厂类也要随之扩展,一对一存在,满足了开闭原则
Ⅲ、缺点
- 如果目标实现较多,多工厂模式的实现类也会增多,不简洁
三、使用场景
-
JDBC数据库连接池,在标准SQL的前提下,从MYSQL切换到ORACLE,只需要修改驱动名称即可
-
MyBatis中使用的比较多,事务模块和数据源模块都使用了工厂方法模式