工厂模式
工厂模式(Factory Pattern)是软件开发中常用的一种创建型设计模式,它的核心思想是将对象的创建与使用分离,从而提高代码的可维护性、扩展性和灵活性。工厂模式通过一个工厂类来负责创建其他类的对象实例。使用者不需要关心具体的实现类,只需要告诉工厂需要哪种类型的产品,工厂会根据需求返回相应的对象。
核心组成:
产品接口或抽象类(Product) 定义所有具体产品都必须实现的方法。
具体产品类(Concrete Product) 实现产品接口的具体类。
工厂类(Factory)
负责根据传入的参数创建不同的产品实例。
工厂模式的优点
解耦:客户端无需知道具体产品的类名,只需知道对应的参数。
易于扩展:新增产品时只需添加新的具体类和修改工厂逻辑,符合开闭原则。
集中管理对象创建逻辑:统一管理对象的创建流程。
使用场景
适用情况及示例 | |
---|---|
当一个类不能预知需要创建哪种类的对象 | 当你的系统中存在多个可能的对象类型,而这些类型的确定依赖于运行时条件。 例如:根据不同的操作系统加载不同的 UI 组件。 |
当想让用户专注于所需对象的功能而不是其创建过程 | 隐藏对象创建的具体细节,使得用户只需要关心如何使用对象,而不需要了解如何创建它们。 例如:游戏中的角色生成器,玩家只需选择角色类型,无需知道具体是如何生成的。 |
当类希望它的子类来指定它将创建的对象 | 子类可以根据具体情况决定实例化哪个具体的类。 例如:文档处理软件,根据不同文件格式(如 PDF、Word 等)实例化相应的处理器。 |
当引入新类时,不希望影响现有代码 | 易于扩展,可以轻松地添加新的产品类而不修改现有的工厂类或客户端代码。 例如:支付网关支持多种支付方式,增加一种新的支付方式时仅需新增相应的产品类和工厂类即可。 |
当你有多个具有共同主题的产品等级结构 | 工厂方法模式非常适合用于实现产品族的概念。 例如:家具制造公司生产不同风格(现代、古典)的桌子、椅子等,每种风格都是一个产品等级结构。 |
简化客户端代码 | 客户端代码不需要知道关于被创建对象的具体类的信息,只需要知道对应工厂提供的接口。 例如:数据库连接池管理,客户端只需请求连接,不必关心底层使用的具体数据库类型。 |
示例
先创建 Bean:Person、WangYuan、DinZhen
简单工厂模式
使用一个工厂类根据传入的参数创建不同的产品对象。
在 Spring 中可以利用自动装配进行注入 bean,子类通过实现 getType,在创建 Bean 时调用 getType()来判断注入哪个实现类。
java
public class SimpleFactory {
public static Person createPerson(String name) {
return switch (name) {
case "王源" -> new WangYuan();
case "丁真" -> new DinZhen();
default -> throw new IllegalArgumentException("未知的人物类型: " + name);
};
}
}
// 使用
Person person = SimpleFactory.createPerson("丁真");
工厂方法
定义抽象工厂和具体工厂让具体工厂去创建对象。
每个具体产品对应一个具体工厂。
java
// 定义工厂抽象类-抽象工厂
public abstract class PersonFactory {
public abstract Person createPerson();
}
// 对应Bean的工厂继承抽象类-具体工厂
public class DinZhenFactory extends PersonFactory {
@Override
public Person createPerson() {
return new DinZhen();
}
}
// 使用
PersonFactory personFactory = new WangYuanFactory();
Person person = personFactory.createPerson();
抽象工厂
提供一个创建一系列相关或依赖对象族的接口,而无需指定具体类。
适用于多个产品等级结构的产品组合。
java
// 抽象工厂
public interface PersonFactory {
Person createPerson();
SmokeBrand getSmokeBrand();
}
// 具体实现类
public class DinZhenFactory implements PersonFactory {
@Override
public Person createPerson() {
return new DinZhen();
}
@Override
public SmokeBrand getSmokeBrand() {
return new RickSmoke();
}
}
// 具体实现类
public class WangYuanFactory implements PersonFactory {
@Override
public Person createPerson() {
return new WangYuan();
}
@Override
public SmokeBrand getSmokeBrand() {
return new FuRongWangSmoke();
}
}