代码仓库:https://gitee.com/yangsiyuan/Design-Pattern
创建型设计模式:聚焦于实例化对象,通常提供一种隐藏创建逻辑的形式,取代直接使用new运算符实例化对象
写在前面的话:
工厂模式,一般针对需要对实际操作细节进行隐藏,并需要保证扩展性的场景。比较常见的比如:
- Spring data jpa提供JpaRepository对象,隐藏实际操作的数据库,实现多种数据库兼容,且在切换底层数据库时,对业务层无影响
- Spring boot提供AmqpTemplate对象,同样对多种消息中间件实现了兼容、以及无感切换
1. 定义
工厂模式(Factory Pattern):对客户端隐藏具体的对象创建逻辑,并且暴露接口来指向新创建的对象
核心定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
优点:扩展性高,若想增加子类,只需要扩展工厂类即可;封装性高,调用者只需知道对象名称,无需关心实现
应用场景:日志记录(无需关心文件存储的方式)、数据库访问(无需关心访问的数据库类型)
2. 代码实现
1)定义接口
// 接口
public interface ICar {
void run();
}
2)定义实现类
public class Benz implements ICar {
@Override
public void run() {
System.out.println("Benz is runnning!!");
}
}
public class Honda implements ICar{
@Override
public void run() {
System.out.println("Honda is running!!");
}
}
3)定义工厂类
- 提供一个public接口,通过名称,获取对应的对象
- 返回对象通过接口接收
public class CarFactory {
// 工厂类
public ICar getCar(String brandName){
if(brandName == null){
return null;
}
if("Benz".equals(brandName)){
return new Benz();
}else if("Honda".equals(brandName)){
return new Honda();
}
return null;
}
}
4)调用demo
public class FactoryPatternTest {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
ICar benz = carFactory.getCar("Benz");
benz.run();
ICar honda = carFactory.getCar("Honda");
honda.run();
}
}