欢迎光临
我们一直在努力

《设计模式》第三篇:工厂模式

本期内容为自己总结归档,共分6章,本人遇到过的面试问题会重点标记。

《设计模式》第一篇:初识

《设计模式》第二篇:单例模式

《设计模式》第三篇:工厂模式

《设计模式》第四篇:观察模式

《设计模式》第五篇:策略模式

《设计模式》第六篇:装饰器模式

《设计模式》第七篇:适配器模式

《设计模式》第八篇:创建型模式

《设计模式》第九篇:结构型模式

《设计模式》第十篇:行为型模式

《设计模式》第十一篇:总结&常用案例

(若有任何疑问,可在评论区告诉我,看到就回复)

一、工厂模式的核心思想

1.1 为什么需要工厂模式?

在软件设计中,对象的创建往往比使用更复杂,原因包括:

  • 创建逻辑复杂:对象创建可能涉及复杂的初始化过程

  • 依赖环境:需要根据配置、运行时环境决定创建哪种对象

  • 需要统一管理:某些对象的创建需要统一控制

  • 需要解耦:避免创建逻辑污染业务代码

  • 工厂模式的核心理念是:封装变化点。将对象创建这个变化点封装起来,让客户端代码保持稳定。

    1.2 工厂模式的演化路径

    工厂模式不是单一模式,而是一个模式家族

    二、简单工厂模式

            专门定义一个类来负责创建其他类的实例,根据参数的不同创建不同类的实例,被创建的实例通常都具有共同的父类。这个模式叫简单工厂模式SimpleFactory),又称为静态工厂方法模式

    2.1、优缺点

    简单工厂的优点

  • 抽象出一个专门的类来负责某类对象的创建,分割出创建的职责,不能直接去创建具体的对象,只要传入适当的参数即可。

  • 使用者可以不用关注具体对象的类名称,只知道传入什么参数可以创建哪些需要的对象。

  • 实现简单、结构浅析

  • 简单工厂的缺点

    • 如果产品的种类非常多,createProduct 方法会变得非常庞大,switch … case …(或 if … else …)的判断会变得非常多。

    • 不符合开放—封闭原则(对拓展开放,对修改封闭),如果要增加或删除一个产品种类,就要修改 switch … case …(或 if … else …)的判断代码。

    2.2、代码示例

    // 产品接口
    public interface Button {
    void render();
    }

    // 具体产品
    public class WindowsButton implements Button {
    @Override
    public void render() {
    System.out.println("渲染Windows风格的按钮");
    }
    }

    // 简单工厂
    public class ButtonFactory {
    public static Button createButton(String osType) {
    if ("windows".equals(osType)) {
    return new WindowsButton();
    } else if ("macos".equals(osType)) {
    return new MacOSButton();
    }
    throw new IllegalArgumentException("不支持的OS类型");
    }
    }

    三、工厂方法模式

            工厂方法模式是简单工厂模式的一个升级版本,为解决简单工厂模式中不符合开放-封闭原则的问题,我们对 SimpleFactory 进行了一个拆分,抽象出一个父类 Factory,并增加多个子类分别负责创建不同的具体产品。

    3.1、优缺点

    优点:

    • 解决了简单工厂模式中不符合 开放—封闭原则 的问题,使程序更容易拓展。

    • 实现简单,因为工厂方法模式简单且易于拓展,因此在项目中应用的非常广泛,在很多标准库和开源项目中都能看到他的影子。

    缺点:

    • 对于有多种分类的产品,或具有二级分类的产品,工厂方法模式并不适用。(如果二级子类当作一级处理,会造成子类超级多)

    3.2、代码示例

    // 产品接口
    public interface Logger {
    void log(String message);
    }

    // 具体产品
    public class FileLogger implements Logger {
    @Override
    public void log(String message) {
    System.out.println("写入文件: " + message);
    }
    }

    // 抽象工厂
    public abstract class LoggerFactory {
    public abstract Logger createLogger();
    }

    // 具体工厂
    public class FileLoggerFactory extends LoggerFactory {
    @Override
    public Logger createLogger() {
    return new FileLogger();
    }
    }

    四、抽象工厂模式

            抽象工厂模式又是工厂方法模式的升级版本,工厂方法模式不能解决具有二级分类的产品的创建,抽象工厂模式就是用来解决这一缺陷的。

            工厂下有两个产品线,分为一级能源消耗、二级能源消耗。每个产品线都可以生产产品A和B。这种情况下,使用抽象工厂模式。

    4.1、优缺点

    优点:

    • 解决了具有二级分类的产品的创建。

    缺点:

    • 如果产品的分类超过二级,如三级甚至更多的级,抽象工厂模式将会变得非常臃肿。

    • 不能解决产品有多种分类多种组合的问题。

    注意: 如果产品出现三级甚至更多级的分类怎么办?

    答:优化业务逻辑,结合其他模式一起使用。例如工厂+中介

    4.2、代码示例

    // 抽象产品接口
    public interface Button {
    void render();
    }

    public interface TextBox {
    void render();
    }

    // 抽象工厂
    public interface GUIFactory {
    Button createButton();
    TextBox createTextBox();
    }

    // 具体工厂
    public class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
    return new WindowsButton();
    }

    @Override
    public TextBox createTextBox() {
    return new WindowsTextBox();
    }
    }

    // 客户端
    public class Application {
    private GUIFactory factory;

    public Application(GUIFactory factory) {
    this.factory = factory;
    }

    public void renderUI() {
    Button button = factory.createButton();
    TextBox textBox = factory.createTextBox();
    button.render();
    textBox.render();
    }
    }

    五、工厂模式在Spring框架中的应用

    5.1 BeanFactory:Spring的核心工厂

    BeanFactory是Spring IoC容器的核心接口,本质上是抽象工厂模式:

    // BeanFactory接口定义(简化)
    public interface BeanFactory {
    Object getBean(String name);
    <T> T getBean(Class<T> requiredType);
    }

    // ApplicationContext是增强版
    public interface ApplicationContext extends BeanFactory {
    // 更多企业级功能
    }

    5.2 FactoryBean:特殊的Bean创建逻辑

    FactoryBean是一个特殊的Bean,用于自定义复杂对象的创建逻辑:

    public interface FactoryBean<T> {
    T getObject() throws Exception;
    Class<?> getObjectType();
    boolean isSingleton();
    }

    // 示例:创建复杂对象
    @Component
    public class ComplexObjectFactoryBean implements FactoryBean<ComplexObject> {

    @Override
    public ComplexObject getObject() throws Exception {
    // 复杂的创建逻辑
    ComplexObject obj = new ComplexObject();
    obj.initialize();
    return obj;
    }

    @Override
    public Class<?> getObjectType() {
    return ComplexObject.class;
    }
    }

    关键点:

  • FactoryBean本身是一个Bean,由BeanFactory管理

  • 当需要获取FactoryBean生产的对象时,Spring会调用getObject()方法

  • 这种机制适合创建需要复杂初始化的对象

  • 5.3 Spring中的工厂方法模式

    Spring支持通过静态工厂方法和实例工厂方法创建Bean:

    // XML配置方式
    <bean id="service" class="com.example.ServiceFactory"
    factory-method="createService"/>

    // 注解配置方式
    @Configuration
    public class AppConfig {

    @Bean
    public Service service() {
    return ServiceFactory.createService();
    }
    }

    总结

    工厂模式是创建型设计模式中最常用的模式之一:

  • 模式演进:

    • 简单工厂 → 工厂方法 → 抽象工厂

    • 逐步抽象,逐步符合设计原则

  • 核心价值:

    • 封装变化,分离关注点

    • 提高代码的可维护性和扩展性

  • 实际应用:

    • Spring框架的核心机制

    • JDK中的广泛应用

    • 连接池、缓存等基础设施

  • 最佳实践:

    • 根据场景选择合适模式

    • 避免过度设计

  • 记住:工厂模式是工具,不是目标。目标是写出清晰、可维护、可扩展的代码。

    赞(0)
    未经允许不得转载:171主机测评 » 《设计模式》第三篇:工厂模式
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址