简单工厂模式

1. 简单工厂模式定义

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

旨在通过一个公共的接口来创建各种不同类型的对象,不同条件下创建不同的实例。在简单工厂模式中,一个工厂类负责根据输入参数创建相关的对象实例。这可以隐藏对象创建的细节,让客户端代码只需要和工厂类打交道,而不需要直接去实例化对象。

2. 简单工厂模式结构

  1. Factory:工厂角色,负责创建具体产品的对象
  2. Product:抽象产品角色,定义了产品的共同接口或抽象类,规定了产品对象的共同方法。
  3. ConcreteProduct:具体产品角色,定义了具体产品的特定行为和属性。

结构图:

3. 简单工厂模式举例

设计一个程序,根据用户输入的形状名称画出对应形状图形,比如画出正方形和圆形。

定义一个形状接口 Shape,以及其具体实现类 CircleSquare。这时可以创建一个简单工厂类 ShapeFactory,它包含一个方法 createShape(String type),根据参数 type 创建不同的形状对象。

java 复制代码
public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}

public class ShapeFactory {
    public Shape createShape(String type) {
        if ("circle".equalsIgnoreCase(type)) {
            return new Circle();
        } else if ("square".equalsIgnoreCase(type)) {
            return new Square();
        }
        return null;
    }
}

使用简单工厂模式,客户端可以像下面这样创建并使用形状对象,而不需要关心具体的创建细节:

java 复制代码
ShapeFactory factory = new ShapeFactory();
Shape shape1 = factory.createShape("circle");
shape1.draw();

Shape shape2 = factory.createShape("square");
shape2.draw();

简单工厂模式可以帮助降低客户端和具体类之间的耦合度,使得代码更易于维护和扩展。

结构图:

4. 简单工厂模式的优缺点

4.1 优点

  1. 隐藏对象创建细节:客户端不需要了解和处理对象的创建细节,只需通过工厂来获取对象。
  2. 集中化管理:通过工厂集中管理对象的创建过程,便于维护和修改。如果需要改变创建对象的逻辑,只需要修改工厂类而不影响客户端。
  3. 降低耦合度:客户端代码与具体类之间的耦合度降低,因为客户端只与工厂类交互而不直接依赖具体类的实例化过程。

4.2 缺点

  1. 扩展性受限:如果需要添加新的产品类型,通常需要修改工厂类的逻辑,违反了开闭原则。
  2. 责任过重:工厂类负责创建多种产品,导致工厂类代码可能会变得非常庞大。
  3. 违反单一职责原则:工厂类不仅负责对象的创建,还可能包括其它业务逻辑,违反了单一职责原则。
相关推荐
数智启示录28 分钟前
PostgreSQL 执行计划实战(第 9 篇):SQL 和索引没变,计划为什么突然慢一百倍
数据库·经验分享·sql·postgresql·面试
数智启示录1 小时前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
Carl_奕然1 小时前
【智能体】Agent的四种设计模式之:React(2026最新版)
javascript·人工智能·python·react.js·设计模式·语言模型
数智启示录1 小时前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
cfm_29141 小时前
Spring核心设计模式
java·spring·设计模式
CoderYanger2 小时前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯
数智启示录2 小时前
Apache Kafka 不只是消息队列:日志与 Offset 分离如何让事件可重放 【Kafka合集】
经验分享·分布式·面试·kafka·apache
数智启示录2 小时前
Apache Kafka 同 Key 仍会乱序:从分区 Offset 到业务可见的四道边界 【Kafka 合集】
大数据·数据库·经验分享·分布式·面试·kafka·apache
haon11223 小时前
面试高频题与口述框架:怎么把经历讲成故事
面试·职场和发展
黄敬峰14 小时前
Agent Memory 进阶:用 LLM 总结压缩上下文,告别"金鱼记忆"
面试