Skip to content

工厂模式

工厂模式(Factory Pattern)是软件开发中常用的一种创建型设计模式,它的核心思想是将对象的创建与使用分离,从而提高代码的可维护性、扩展性和灵活性。工厂模式通过一个工厂类来负责创建其他类的对象实例。使用者不需要关心具体的实现类,只需要告诉工厂需要哪种类型的产品,工厂会根据需求返回相应的对象。

核心组成:

  1. 产品接口或抽象类(Product) 定义所有具体产品都必须实现的方法。

  2. 具体产品类(Concrete Product) 实现产品接口的具体类。

  3. 工厂类(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();
    }
}
最近更新