设计模式--简单(抽象)工厂模式

简单工厂模式(Simple Factory Pattern)详解

在软件开发中,我们经常需要根据不同的需求创建不同的对象实例。为了让代码更加灵活和可维护,设计模式提供了多种创建对象的方式,其中简单工厂模式(Simple Factory Pattern)就是一种常见且实用的方式。

什么是简单工厂模式?

简单工厂模式是由一个工厂类根据传入的参数,决定创建哪一种产品类的实例。这种模式将实例化对象的逻辑集中到一个工厂类中,使得客户端代码从直接创建对象的过程中解耦出来,简化了对象创建的过程。

示例:创建不同类型的形状对象

为了更好地理解简单工厂模式,我们来看一个具体的示例:假设我们需要创建不同类型的形状对象,比如圆形(Circle)、矩形(Rectangle)和正方形(Square)。

第一步:定义形状接口

首先,我们定义一个形状接口(Shape),所有具体的形状类都实现这个接口。

java 复制代码
public interface Shape {
    void draw();
}
第二步:创建具体的形状类

接下来,我们创建实现 Shape 接口的具体形状类,比如 CircleRectangleSquare

java 复制代码
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Circle");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Rectangle");
    }
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a Square");
    }
}
第三步:创建工厂类

然后,我们创建一个工厂类(ShapeFactory),它包含一个静态方法,根据参数返回不同的形状对象。

java 复制代码
public class ShapeFactory {
    public static Shape createShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}
第四步:使用工厂类创建形状对象

最后,我们在客户端代码中使用工厂类来创建不同的形状对象,而不是直接实例化具体的形状类。

java 复制代码
public class Client {
    public static void main(String[] args) {
        Shape shape1 = ShapeFactory.createShape("CIRCLE");
        shape1.draw();

        Shape shape2 = ShapeFactory.createShape("RECTANGLE");
        shape2.draw();

        Shape shape3 = ShapeFactory.createShape("SQUARE");
        shape3.draw();
    }
}
总结

简单工厂模式通过一个工厂类集中管理实例化对象的逻辑,使得客户端代码不需要直接与具体类打交道,只需要知道工厂类和接口/抽象类即可。这种模式的优点在于代码清晰、维护方便,但也有一些缺点,如工厂类可能会变得复杂,并且违反了开闭原则,因为每次添加新的具体类时都需要修改工厂类的代码。

相关推荐
今天AI了吗38 分钟前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
benchmark_cc40 分钟前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库44 分钟前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H1 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
许彰午1 小时前
27-AuthService登录链路
java·低代码·架构
泡海椒1 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP1 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
Rain的Java大神之路2 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
自动化监测Learner2 小时前
Navicat Premium 17 中文版安装教程(2026最新版)
java·linux·数据库
江畔柳前堤2 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native