当前位置: 首页 > article >正文

8 设计模式之简单工厂模式

        设计模式是软件开发中的一套通用解决方案,而简单工厂模式则是最基础、最常用的一种创建型模式。在这篇博客中,我将为大家详细介绍简单工厂模式的概念、优缺点,以及通过一个饮料制作的案例,帮助大家更好地理解和应用这种模式。


一、简单工厂模式是什么?

        简单工厂模式是一种一个工厂类 根据传入的参数,动态决定创建哪种产品类实例的设计模式。虽然简单工厂不属于 GOF(四人帮)提出的23种设计模式之一,但它是工厂模式家族的重要成员。

1.简单工厂的组成:

  • 工厂类(Factory Class):
    提供创建具体产品的功能,负责封装实例化逻辑。
  • 抽象产品类(Product Interface/Abstract Class):
    定义产品的共性行为,是具体产品类的父类或接口。
  • 具体产品类(Concrete Product Classes):
    实现或继承抽象产品类,包含具体的产品功能。

2.简单工厂的优缺点:

优点:

  • 客户端无需关心对象的创建细节,只需通过工厂获取对象即可,符合 "单一职责原则"
  • 实现了对象的创建与使用分离。

缺点:

  • 增加新的产品时,工厂类需要修改逻辑,不符合 "开闭原则"(对扩展开放,对修改关闭)。
  • 工厂类的职责较重,可能造成类的复杂度增加。

二、案例:饮料制作工厂

1.需求描述:

        我们需要设计一个饮料制作工厂,可以根据用户需求制作不同类型的饮料,包括咖啡、茶水和果汁。用户输入饮料类型后,工厂动态创建对应的饮料对象,并执行制作方法。

2.具体代码

(1)抽象产品类:Drink

abstract class Drink {
    public abstract void make(); // 定义统一的制作方法
}

(2)具体产品类:CoffeeTeaJuice

public class Coffee extends Drink {
    @Override
    public void make() {
        System.out.println("咖啡制作中");
    }
}

public class Tea extends Drink {
    @Override
    public void make() {
        System.out.println("茶水制作中");
    }
}

public class Juice extends Drink {
    @Override
    public void make() {
        System.out.println("果汁制作中");
    }
}

(3)工厂类:DrinkFactory

public class DrinkFactory {
    public static Drink createDrink(String type) {
        if ("咖啡".equalsIgnoreCase(type)) {
            return new Coffee();
        } else if ("茶水".equalsIgnoreCase(type)) {
            return new Tea();
        } else if ("果汁".equalsIgnoreCase(type)) {
            return new Juice();
        } else {
            throw new IllegalArgumentException("未知的饮料类型:" + type + "。请输入:咖啡、茶水或果汁!");
        }
    }
}

(4)测试类:SimpleFactoryTest

public class SimpleFactoryTest {
    public static void main(String[] args) {
        Drink coffee = DrinkFactory.createDrink("咖啡");
        coffee.make(); // 输出:咖啡制作中

        Drink tea = DrinkFactory.createDrink("茶水");
        tea.make(); // 输出:茶水制作中

        try {
            Drink unknown = DrinkFactory.createDrink("牛奶");
            unknown.make();
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }
    }
}

(5)运行结果:

咖啡制作中
茶水制作中
未知的饮料类型:牛奶。请输入:咖啡、茶水或果汁!


三、案例解析与优化建议

1.封装逻辑:

        DrinkFactorycreateDrink() 方法封装了饮料对象的创建逻辑,客户端无需直接使用 new,只需传入饮料类型即可获得对应对象。

2.扩展性问题:

        如果需要添加新饮料,比如 "牛奶",需要修改工厂类的 createDrink() 方法逻辑。这违背了 开闭原则,但在简单需求下是可以接受的。

3.改进方向:

        使用枚举类型: 定义饮料类型为枚举常量,避免字符串硬编码导致错误。

        动态注册: 工厂可以设计为支持动态注册新产品,减少对代码的修改。


四、总结

        简单工厂模式是一种结构清晰、实现简单的设计模式,在开发中非常实用。它通过将对象的创建逻辑集中管理,使代码更具可读性和维护性。通过这次饮料制作工厂的实践,我们学会了如何应用简单工厂模式,完成了对象创建与业务逻辑的分离。

        你也可以试着实现自己的简单工厂,加入更多种类的饮料或者其它领域的场景!

        希望这篇博客能帮助到你。如果觉得有用,记得点赞、收藏哦!欢迎在评论区分享你的实现与想法! 😊


以上案例和博客内容由一次学习与实践经历整理而成,感谢每一次思考与成长!


http://www.kler.cn/a/413543.html

相关文章:

  • 《物联网智能项目》
  • Linux笔记---进程:进程优先级
  • DAY135权限提升-系统权限提升篇数据库提权PostsqlRedis第三方软件提权密码凭据钓鱼文件
  • 用shell脚本写一个通用的监听程序异常并重启脚本
  • notepad++文件github下载
  • Novai Chain 通证派发策略:重塑区块链生态的新范式
  • 【Webgl_glslThreejs】制作流水效果/毛玻璃效果材质
  • c++(斗罗大陆)
  • 基于深度学习的手势识别算法
  • mysql定位慢查询以及分析原因
  • 搭建AD域服务器
  • 【jmeter】服务器使用jmeter压力测试(从安装到简单压测示例)
  • 深入解析下oracle char和varchar2底层存储方式
  • 使用Python实现自动化邮件通知:当长时程序运行结束时
  • Linux环境变量(添加环境变量、修改系统环境变量、内建命令和非内建命令)
  • 51单片机从入门到精通:理论与实践指南入门篇(三)
  • ArraList和LinkedList区别
  • aws服务--机密数据存储AWS Secrets Manager(1)介绍和使用
  • [Unity] 【游戏开发】角色设计3-如何为角色实现响应输入的控制器
  • 数据结构——用链表实现栈和队列