简单工厂模式(Simple Factory)

简单工厂模式,又称为静态工厂方法(Static Factory Method)模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式不属于GoF的23个设计模式,可看成是工厂方法模式的退化实现。

结构设计

简单工厂模式包含如下角色:

Factory,工厂类,负责实现创建所有实例的内部逻辑。

Product,抽象产品,用来定义工厂所创建的对象的接口。

ConcreteProduct,具体产品,用来实现Product的接口。

简单工厂模式类图表示如下:

伪代码实现

java 复制代码
// 1.1 定义产品(Product)抽象类(也可以是基类),对产品接口进行声明
public abstract class Product {
    abstract void function();
}
// 1.2 定义具体产品(Concrete Products),产品接口的不同实现
public class ConcreteProductA extends Product {
    @Override
    public void function() {
        System.out.println("---------do some thing in a ConcreteProductA instance---------");
    }
}
public class ConcreteProductB extends Product {
    @Override
    public void function() {
        System.out.println("---------do some thing in a ConcreteProductB instance---------");
    }
}
// 2、产品工厂(Product Factory),定义返回产品对象的静态工厂方法。该方法的返回对象类型是产品的基类(Product)。
// 该类最主要的职责就是根据入参的不同创建不同的产品。
public class ProductFactory {
    /**
     * 根据条件生产产品
     * 注意:这里以产品名作为入参,具体场景还应灵活处理
     */
    public static Product create(String productName) {
        if (productName.contains("ConcreteProductA")) {
            return new ConcreteProductA();
        }
        if (productName.contains("ConcreteProductB")) {
            return new ConcreteProductB();
        }
        return null;
    }
}

// 3、客户端调用
public class FactoryMethodClient {
    public void test() {
        // (1) 通过工厂创建产品
        Product productA = ProductFactory.create(ConcreteProductA.class.getName());
        // (2) 使用产品
        productA.function();

        Product productB = ProductFactory.create(ConcreteProductB.class.getName());
        productB.function();
    }
}

适用场景

在以下情况下可以使用简单工厂模式:

(1) 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

(2) 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

优缺点

简单工厂模式有以下优点:

(1) 责任分离。工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,仅需要使用产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。

(2) 使用简单。客户端在使用产品时,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。

(3) 提高系统灵活性。通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

但是简单工厂模式也存在以下缺点:

(1)违反开闭原则。工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。

(2) 可扩展性差。一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展。另外,简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

参考

https://www.runoob.com/design-pattern/factory-pattern.html 简单工厂模式
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html 简单工厂模式
https://blog.csdn.net/ShuSheng0007/article/details/86634864 秒懂设计模式之简单工厂模式

相关推荐
超梦dasgg11 分钟前
Java 生产环境 MQ 技术选型全解析
java·开发语言·java-rocketmq·java-rabbitmq
霸道流氓气质11 分钟前
Spring AI 多工具链式调用(Tool Chain)极简实战
java·人工智能·spring
罗超驿1 小时前
22.深入剖析JDBC架构:从原生API到企业级数据交互核心
java·数据库·mysql·面试
一直有一个ac的梦想1 小时前
cmu15445 2025fall lec 18 transactions with two-phase lock
java·开发语言·数据库
九皇叔叔1 小时前
Spring-Ai-Alibaba [04] 04-llm-platform-custom-demo
java·人工智能·spring
技术路上的探险家1 小时前
Sa-Token 单点登录(SSO)三种模式大白话详解:告别重复登录
java·sa-token·单点登录·sso
JAVA社区1 小时前
Java进阶全套教程(四)—— SpringMVC框架详解
java·开发语言·spring·面试·职场和发展
ㄣ知冷煖★1 小时前
统一网关架构实践:从 Token 鉴权到路由、策略与凭证池转发全链路解析
java·服务器·架构
Lumbrologist1 小时前
【C++】零基础入门 · 第 2 节:变量、基本数据类型与输入输出
java·开发语言·c++
GISer_Jing1 小时前
Three.JS渲染架构解读
java·javascript·架构