23种设计模式——工厂方法模式(Factory Method Pattern)详解
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式——工厂方法模式(Factory Method Pattern)
📚 ** ps ** :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。
目录
一. 背景
二. 定义
三. 结构组成
四.代码示例
1. 工厂类的创建
2. 工厂方法模式的使用
五. 优点
六. 缺点
七. 适用场景
八. 总结
一. 背景
工厂方法模式是一种比较常见并且简单的设计模式。相比较于简单工厂模式(具体类别的实现放到Factory)相比,它将对象的创建过程委托给子类工厂,使其符合了开闭原则。如果我们之后要创建几个有共性的对象,我们可以考虑使用工厂方法模式。
二. 定义
工厂方法模式是一种创建型设计模式,它在父类中提供了一个创建对象的接口(或抽象方法),但允许子类决定要实例化的具体类型。简单来说,就是将对象的实例化过程推迟到子类中进行。
核心思想:
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类
- 工厂方法使一个类的实例化延迟到其子类
三. 结构组成
工厂方法模式主要包含以下角色:
- Product(抽象产品) - 定义产品的接口
- ConcreteProduct(具体产品) - 实现抽象产品接口的具体产品类
- Creator(抽象工厂) - 声明工厂方法,返回Product类型对象
- ConcreteCreator(具体工厂) - 重写工厂方法,返回具体产品实例
四.代码示例
1. 工厂类的创建
// 抽象产品 abstract class Product {public abstract void use(); }// 具体产品A class ConcreteProductA extends Product {@Overridepublic void use() {System.out.println("Using Product A");} }// 具体产品B class ConcreteProductB extends Product {@Overridepublic void use() {System.out.println("Using Product B");} }// 抽象工厂 abstract class Creator {// 工厂方法public abstract Product factoryMethod();// 业务方法public void someOperation() {Product product = factoryMethod();product.use();} }// 具体工厂A class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();} }// 具体工厂B class ConcreteCreatorB extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductB();} }
2. 工厂方法模式的使用
// 使用具体工厂A创建产品 Creator creatorA = new ConcreteCreatorA(); creatorA.someOperation(); // 输出: Using Product A// 使用具体工厂B创建产品 Creator creatorB = new ConcreteCreatorB(); creatorB.someOperation(); // 输出: Using Product B
五. 优点
- 符合开闭原则 - 新增产品时无需修改现有代码
- 符合单一职责原则 - 每个工厂类只负责创建特定产品
- 良好的封装性 - 客户端不需要知道具体产品的创建细节
- 良好的扩展性 - 增加新产品只需增加相应的工厂类
六. 缺点
- 类数量增加 - 每增加一个产品类就需要增加一个对应的工厂类
- 增加了系统的抽象性和复杂度
七. 适用场景
- 当一个类不知道它所需要的对象的类时
- 当一个类希望通过其子类来指定创建对象时
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时
八. 总结
工厂方法模式是面向对象设计中非常重要的创建型模式,它通过将对象的创建过程封装起来,使得系统在不修改具体类的情况下增加新的产品对象。这种模式在实际开发中应用广泛,特别是在需要创建多种相似产品对象的场景中。