当前位置: 首页 > article >正文

Java设计模式 三 工厂方法模式 (Factory Method Pattern)

工厂方法模式 (Factory Method Pattern) 是一种常见的创建型设计模式,旨在通过定义一个接口来创建对象,而将实例化对象的具体类延迟到子类中。工厂方法模式允许客户端通过工厂方法来创建对象,而不需要直接调用构造函数,这样可以减少代码中的耦合度,并允许在不修改客户端代码的情况下更改对象的创建过程。

1. 工厂方法模式的结构

工厂方法模式的核心思想是将对象的创建与使用分开,定义一个工厂方法用于创建对象,并让子类实现这个工厂方法。

  • Product(产品接口):定义了产品的接口。
  • ConcreteProduct(具体产品):实现了 Product 接口,具体产品类。
  • Creator(创建者):声明了工厂方法,该方法返回一个 Product 对象。通常是抽象类或接口。
  • ConcreteCreator(具体创建者):实现了 Creator 类,并实现了工厂方法来返回具体的产品对象。

2. 工厂方法模式的优点

  • 扩展性强:增加新的具体产品类时,只需要添加新的 ConcreteProduct 类和新的 ConcreteCreator 子类,而不需要修改现有的客户端代码。
  • 解耦合:客户端不需要知道产品类的具体实现,只需依赖产品接口和工厂接口,可以降低类之间的耦合度。
  • 提高代码可维护性:如果产品的创建方式发生变化,只需要在工厂方法中进行修改,不会影响到客户端代码。

3. 工厂方法模式的缺点

  • 类的数量增加:为了每种产品提供一个工厂类,会导致系统中的类数量增加,可能使系统变得更复杂。
  • 灵活性差:如果需要创建大量不同类型的对象时,工厂方法模式的实现会比较冗长,维护成本高。

4. 工厂方法模式的实现

1) 定义产品接口

产品接口定义了不同类型产品的公共方法。

public interface Product {
    void doSomething();
}
2) 具体产品类

具体产品类实现了产品接口。

public class ConcreteProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("ConcreteProductA doing something.");
    }
}

public class ConcreteProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("ConcreteProductB doing something.");
    }
}
3) 定义创建者接口

创建者接口声明了工厂方法,用来创建产品对象。

public abstract class Creator {
    public abstract Product factoryMethod();
}
4) 具体创建者类

具体创建者类实现了工厂方法,返回具体的产品实例。

public class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

public class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}
5) 客户端使用工厂方法

客户端只需要依赖于 Creator 类,而无需知道产品的具体实现。通过工厂方法来创建产品实例。

public class Client {
    public static void main(String[] args) {
        Creator creatorA = new ConcreteCreatorA();
        Product productA = creatorA.factoryMethod();
        productA.doSomething();  // 输出: ConcreteProductA doing something.
        
        Creator creatorB = new ConcreteCreatorB();
        Product productB = creatorB.factoryMethod();
        productB.doSomething();  // 输出: ConcreteProductB doing something.
    }
}

5. 工厂方法模式的应用场景

  • 当一个类不知道它所需要的对象的具体类时。通过使用工厂方法,客户端可以依赖接口来获取对象,而无需关心具体的实现类。
  • 当类的实例化过程可能会发生变化时。如果产品的创建过程需要进行修改,工厂方法模式使得客户端不需要修改,只需修改工厂方法即可。
  • 需要通过子类来决定产品的具体类型时。子类可以通过重写工厂方法来创建不同的产品实例。

6. 工厂方法模式与简单工厂模式的比较

  • 简单工厂模式 (Simple Factory):通过一个静态方法来创建对象,客户端调用时直接提供产品类型(通常是枚举或字符串),而不需要依赖工厂接口和具体的工厂类。

    • 缺点:简单工厂模式会使得工厂方法与客户端耦合,产品类型的增加导致修改工厂方法,违反了“开闭原则”(对扩展开放,对修改封闭)。
  • 工厂方法模式:工厂方法模式定义了一个工厂接口,允许不同的工厂子类来创建不同的产品。相比于简单工厂,工厂方法模式更加灵活,符合“开闭原则”。

7. 总结

  • 工厂方法模式 适用于当你需要生成不同类型的产品时,并且希望通过工厂方法来解耦产品的创建与使用逻辑。
  • 它将对象的创建推迟到子类中,并通过工厂方法来返回具体的产品实例,减少了系统中类之间的耦合。
  • 当系统中的产品种类较多时,使用工厂方法模式能够方便地扩展和修改产品的实现,而不影响现有的客户端代码。

通过这种方式,工厂方法模式可以帮助你构建一个灵活且易于扩展的系统。


http://www.kler.cn/a/514509.html

相关文章:

  • MYSQL学习笔记(五):单行函数(字符串、数学、日期时间、条件判断、信息、加密、进制转换函数)讲解
  • 一个软件分发和下载的网站源码,带多套模板
  • 【Linux】环境变量
  • 华为EC6110T-海思Hi3798MV310_安卓9.0_通刷-强刷固件包
  • node.js 文件操作
  • 事件和方法
  • HTML 基础入门:核心标签全解析
  • 深圳大学-计算机系统(3)-实验三取指和指令译码设计
  • simulink入门学习01
  • Redis、MongoDB 和 MySQL评估
  • IBM湖仓一体与向量数据库:访问MinIO控制台(Accessing the MinIO console)
  • AI对齐与开源发展:多学科融合创新之路
  • 第二讲 矩阵消元——用矩阵的左乘表示矩阵消元的过程
  • Spring注解篇:@RequestMapping详解
  • ESP-Mesh-Lite组网方案,赋能设备多场景联网通信,无线交互控制应用
  • PHP常见正则表达式
  • 不用安装双系统,如何在mac上玩windows游戏呢?
  • vim如何显示行号
  • 基于springboot+vue的校园二手物品交易系统的设计与实现
  • 在 Go 语言中如何高效地处理集合
  • LabVIEW处理复杂系统和数据处理
  • 基于Spring Boot+Vue.js的后台管理系统
  • Elasticsearch 8.17.1 JAVA工具类
  • 【深度学习基础】多层感知机 | 权重衰减
  • C++11左值引用和右值引用
  • 神经网络基础详解