工厂模式-简单工厂模式

简单工厂模式是一种创建型设计模式,它通过一个工厂类来封装对象的创建过程,根据参数返回不同产品对象实例。这种模式适用于对象类型较少且不频繁变化的场景,减少客户端与具体产品类之间的耦合。文章通过示例展示了如何创建IProduct接口的实现类以及使用ProductFactory创建产品实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 工厂模式

在面向对象编程中,当需要创建一个对象时,一般是使用类的构造函数来创建它,这种方式存在一个缺点,每次创建相同对象时需要编写大量重复的代码。

工厂模式是一种常见的创建型设计模式,它将对象的创建过程封装在一个工厂类中,使客户端代码无需关心对象的创建过程,只需要通过工厂类来获取所需的对象。

工厂模式又分为:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

本文将将详细阐述 简单工厂模式

2 简单工厂模式

简单工厂模式(Simple Factory Pattern) 通过一个工厂类来封装对象的创建过程,并根据不同的参数返回不同的产品对象实例。简单工厂模式 的核心思想是将对象的创建过程封装在一个工厂类中,而客户端代码只需要通过调用工厂类的静态方法来获取所需的对象实例。

简单工厂模式中通常使用静态方法来创建对象,这种实现方式具有简单、易用、便捷等特点,所以有时候也被称为 静态方法工厂模式(Static Method Factory Pattern)

2.1 应用场景

简单工厂模式 适用于下面的场景:

  • 需要创建的对象的类型较少,不会频繁地发生变化。
  • 客户端不需要关心对象的创建过程,只需要知道如何使用对象即可。
  • 对象的创建过程比较简单,不需要复杂的逻辑。
  • 需要对对象的创建进行封装,从而避免客户端直接创建对象造成的耦合度过高。

2.2 模式详细说明

首先看 简单工厂模式 的类图:
在这里插入图片描述
从上面的类图,可以知道简单工厂模式包含下面的角色:

(1) IProduct: 产品的接口定义。

(2) ConcreteProductX: IProduct 的具体实现类。

(3) ProductFactory: 简单工厂模式的核心,根据传入的参数,实现创建 IProduct 具体实例的逻辑。

(4) Client: 客户类,它不会直接依赖 ConcreteProductX,而是依赖 IProduct,它使用 ProductFactory 创建 IProduct 的具体实例。

2.3 简单工厂模式的例子

IProduct接口

/**
 * IProduct接口定义
 */
interface IProduct {
    void operation();
}

ConcreteProductX 具体产品实现类

/**
 * 产品A实现类
 */
class ConcreteProductA implements IProduct {
    @Override
    public void operation() {
        System.out.println("This is product A");
    }
}
/**
 * 产品B实现类
 */
class ConcreteProductB implements IProduct {
    @Override
    public void operation() {
        System.out.println("This is product B");
    }
}
/**
 * 产品C实现类
 */
class ConcreteProductC implements IProduct {
    @Override
    public void operation() {
        System.out.println("This is product C");
    }
}

ProductFactory 产品简单工厂类

/**
 * 产品的简单工厂类
 */
class ProductFactory {
    public static final int CONCRETE_PRODUCT_A = 1;
    public static final int CONCRETE_PRODUCT_B = 2;
    public static final int CONCRETE_PRODUCT_C = 3;

    public static IProduct createProduct(int productType) {
        if (productType == CONCRETE_PRODUCT_A) {
            return new ConcreteProductA();
        } else if (productType == CONCRETE_PRODUCT_B) {
            return new ConcreteProductB();
        } else if (productType == CONCRETE_PRODUCT_C) {
            return new ConcreteProductC();
        }
        return null;
    }
}

Client 使用简单工厂生成产品的客户类

public class Client {
    public static void main(String[] args) throws Exception {
        List<IProduct> productList = new ArrayList<>();
        productList.add(ProductFactory.createProduct(ProductFactory.CONCRETE_PRODUCT_A));
        productList.add(ProductFactory.createProduct(ProductFactory.CONCRETE_PRODUCT_B));
        productList.add(ProductFactory.createProduct(ProductFactory.CONCRETE_PRODUCT_C));

        for (IProduct product : productList) {
            product.operation();
        }
    }
}

运行程序会输出:

This is product A
This is product B
This is product C
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值