工厂方法(Factory Method)
在父类中提供一个创建对象的接口以允许子类决定实例化对象的类型。
- 创建型模式(负责创建对象)
- 工厂模式(平时所说的工厂模式(Factory Pattern)就是工厂方法模式)
- 此模式的特点是基于抽象工厂扩展具体工厂然后创建产品对象
应用场景分析
- Mybatis(FactoryBean抽象工厂,SqlSessionFactoryBean具体工厂,SqlSessionFactory抽象产品)(DataSourceFactory抽象工厂,UnpooledDataSourceFactory具体工厂)
- Shiro(FactoryBean抽象工厂,ShiroFilterFactoryBean具体工厂)
- Spring(DataSourceFactory抽象工厂,SimpleDriverDataSourceFactory具体工厂)(TransactionFactory抽象工厂)
角色分析
- 抽象产品(Product)
- 具体产品(ConcreteProduct)
- 抽象工厂(Factory)
- 具体工厂(ConcreteFactory)
例如:
mybatis中创建SqlSession对象
- SqlSession(抽象产品)
- DefaultSqlSession(具体产品)
- SqlSessionFactory(抽象工厂)
- DefaultSqlSessionFactory(具体工厂)
Spring整合mybatis时,SqlSessionFactory对象过程分析
- SqlSessionFactory(抽象产品)
- DefaultSqlSessionFactory(具体产品)
- FactoryBean(抽象工厂)
- SqlSessionFactoryBean(具体工厂)
应用分析
- 优势:相对于简单工厂更加灵活,更加适合创建具备等级结构(继承关系)的产品
- 劣势:假如每个抽象产品都对应一个具体工厂,那么工厂类可能会比较多
举个栗子。
汽车接口
public interface Car {
void run();
}
具体汽车:奔驰
public class Benz implements Car{
public void run() {
System.out.println("Benz run");
}
}
具体汽车:宝马
public class Bmw implements Car{
public void run() {
System.out.println("BMW run");
}
}
汽车工厂
public interface CarFactory {
Car createCar();
}
奔驰工厂
public class BenzFactory implements CarFactory{
public Car createCar() {
System.out.println("get Benz");
return new Benz();
}
}
宝马工厂
public class BmwFactory implements CarFactory{
public Car createCar() {
System.out.println("get BMW");
return new Bmw();
}
}
Demo
public class Demo {
public static void main(String[] args) {
CarFactory benzFactory = new BenzFactory();
CarFactory bmwFactory = new BmwFactory();
benzFactory.createCar().run();
bmwFactory.createCar().run();
}
}
结果
get Benz
Benz run
get BMW
BMW run
区别
简单工厂 : 用来生产同一类产品(饮料)的固定产品(可乐、雪碧)。不能增加新的产品(如芬达)
工厂方法 : 用来生产同一类产品(汽车)的任意产品(宝马、奔驰。。。)。支持增加任意工厂(如奥迪工厂),增加任意产品(如奥迪)
抽象工厂 : 用来生产不同产品(电视、手机)的不同 系列(小米、华为)产品。不能增加新的产品类(如空调),支持增加产品系列(如苹果) ,支持增加系列工厂(如苹果工厂),支持增加产品(如苹果手机)