二十三种设计模式-工厂方法模式

工厂方法模式是一种创建型设计模式,其核心思想是通过定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法模式将对象的实例化推迟到子类中进行,从而使得扩展变得容易,而不需要修改现有的代码,符合开闭原则(对扩展开放,对修改封闭)。

工厂方法模式的主要角色

  1. 抽象产品(Product):定义了产品的接口,规定了所有具体产品都必须遵守的接口。
  2. 具体产品(Concrete Product):实现或继承抽象产品角色所定义的接口,由具体工厂类创建。
  3. 抽象工厂(Creator):声明了一个工厂方法,返回一个产品类型的对象。此方法由子类实现以创建具体产品对象。
  4. 具体工厂(Concrete Creator):实现抽象工厂的工厂方法,生成一个具体的产品实例。

工厂方法模式的实现步骤

  1. 定义抽象产品:创建一个抽象类或接口,定义产品的共有接口。
  2. 实现具体产品:为每种产品提供一个具体的类,实现或继承抽象产品类。
  3. 定义抽象工厂:创建一个抽象类或接口,其中包含一个工厂方法,该方法返回一个抽象产品类型的对象。
  4. 实现具体工厂:为每种具体产品提供一个具体的工厂类,实现抽象工厂中的工厂方法,生成具体产品对象。

工厂方法模式的代码示例

复制代码
// 抽象产品
interface Product {
    void use();
}

// 具体产品A
class ConcreteProductA implements Product {
    public void use() {
        System.out.println("Using ConcreteProductA");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    public void use() {
        System.out.println("Using ConcreteProductB");
    }
}

// 抽象工厂
interface Creator {
    Product factoryMethod();
}

// 具体工厂A
class ConcreteCreatorA implements Creator {
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

// 具体工厂B
class ConcreteCreatorB implements Creator {
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

// 客户端代码
public class FactoryMethodPatternDemo {
    public static void main(String[] args) {
        // 客户可以选择使用具体工厂A或B
        Creator creatorA = new ConcreteCreatorA();
        Product productA = creatorA.factoryMethod();
        productA.use();

        Creator creatorB = new ConcreteCreatorB();
        Product productB = creatorB.factoryMethod();
        productB.use();
    }
}

工厂方法模式的优点

  1. 代码的扩展性:增加新产品和新工厂类时,不需要修改已有代码。
  2. 解耦:客户端不需要知道具体的产品类,只需要知道产品接口。
  3. 封装性:具体的创建逻辑被封装在工厂类内部。

工厂方法模式的缺点

  1. 类的个数增多:每增加一个产品,就需要增加一个具体的工厂类。
  2. 系统的复杂度提高:对于新的开发者来说,理解系统结构可能需要更多的时间。

工厂方法模式是实现对象创建和对象使用分离的有效手段,特别适用于需要根据条件动态创建对象的场景。

相关推荐
bkspiderx13 小时前
C++设计模式之行为型模式:访问者模式(Visitor)
c++·设计模式·访问者模式
没有bug.的程序员13 小时前
电商系统分布式架构实战:从单体到微服务的演进之路
java·分布式·微服务·云原生·架构·监控体系·指标采集
Lei活在当下13 小时前
【业务场景架构实战】8. 订单状态流转在 UI 端的呈现设计
android·设计模式·架构
Query*13 小时前
Java 设计模式——代理模式:从静态代理到 Spring AOP 最优实现
java·设计模式·代理模式
梵得儿SHI13 小时前
Java 反射机制深度解析:从对象创建到私有成员操作
java·开发语言·class对象·java反射机制·操作类成员·三大典型·反射的核心api
JAVA学习通13 小时前
Spring AI 核心概念
java·人工智能·spring·springai
望获linux14 小时前
【实时Linux实战系列】实时 Linux 在边缘计算网关中的应用
java·linux·服务器·前端·数据库·操作系统
..Cherry..14 小时前
【java】jvm
java·开发语言·jvm
老K的Java兵器库14 小时前
并发集合踩坑现场:ConcurrentHashMap size() 阻塞、HashSet 并发 add 丢数据、Queue 伪共享
java·后端·spring
计算机毕业设计木哥14 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的爱心公益网站
java·开发语言·vue.js·spring boot·后端·课程设计