【Java 设计模式】简单工厂模式 静态工厂模式

news2025/8/12 9:51:22

简单工厂模式 & 静态工厂模式

  • §1 简单工厂模式
    • §1.1 角色
    • §1.2 点咖啡案例
      • §1.2.1 类图
      • §1.2.2 实现
    • §1.3 优点
    • §1.4 缺点
  • §2 静态工厂模式
    • §2.1 代码变动
    • §2.2 优点

§1 简单工厂模式

  • 简单工厂模式并不属于 23 种设计模式。

§1.1 角色

  • 抽象产品:定义产品的规范,描述产品的主要特性和功能,如:咖啡。
  • 具体产品:实现或继承抽象产品的子类,如:美式咖啡,拿铁咖啡。
  • 具体工厂:提供创建产品的方式,供产品使用者调用获取具体产品,如:咖啡工厂生产咖啡,咖啡店通过咖啡工厂获取咖啡。

§1.2 点咖啡案例

  • 简单工厂模式其实就是将产品的创建工作交由工厂进行,而不是让产品使用者自己去创建。
  • 以点咖啡为例,咖啡店(产品使用者)不用直接去 new 咖啡(具体产品),而是通过调用咖啡工厂(具体工厂)提供的方法来获取咖啡。

§1.2.1 类图

在这里插入图片描述

§1.2.2 实现

// 抽象产品: 咖啡类
public abstract class Coffee {
    public abstract String getName();
    public void addMilk() {
        System.out.println("咖啡加奶");
    }
    public void addSugar() {
        System.out.println("咖啡加糖");
    }
}

// 具体产品: 美式咖啡类
public class AmericanCoffee extends Coffee{
    @Override
    public String getName() {
        return "美式咖啡";
    }
}

// 具体产品: 拿铁咖啡类
public class LatteCoffee extends Coffee{
    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

// 具体工厂: 咖啡工厂类
public class SimpleCoffeeFactory {
    public Coffee createCoffee(String type) {
        Coffee coffee = null;
        if ("AmericanCoffee".equals(type)) {
            coffee = new AmericanCoffee();
        } else if ("LatteCoffee".equals(type)) {
            coffee = new LatteCoffee();
        } else {
            throw new RuntimeException("该产品暂未提供");
        }
        return coffee;
    }
}

// 咖啡店类
public class CoffeeStore {
    public Coffee orderCoffee(String type) {
        SimpleCoffeeFactory factory = new SimpleCoffeeFactory();
        Coffee coffee = factory.createCoffee(type);
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }
}

// 测试类
public class Test {
    public static void main(String[] args) {
        // 1.创建一个咖啡类
        CoffeeStore coffeeStore = new CoffeeStore();
        // 2.点咖啡
        Coffee coffee = coffeeStore.orderCoffee("AmericanCoffee");
        System.out.println(coffee.getName());
    }
}
/* 测试结果:
咖啡加奶
咖啡加糖
美式咖啡
*/

§1.3 优点

  • 与对象解耦。封装了创建对象的过程,将对象的创建与业务逻辑分离开,避免修改客户的代码。如果出现了新的咖啡品种,直接修改咖啡工厂类即可,省去对咖啡店代码的修改。
  • 此时会有人疑问,既然都需要修改代码,为啥不直接修改咖啡店(产品使用者,客户)的代码呢?这是因为可能有很多咖啡店,难道每一个都要去修改一遍吗?这样是不是太麻烦了呢!

§1.4 缺点

  • 虽然咖啡店(客户)代码无需修改,但是需要修改咖啡工厂(具体工厂)的代码,这样同样违反了设计原则中的开闭原则

§2 静态工厂模式

  • 静态工厂模式也不属于 23 种设计模式。
  • 静态工厂模式可以说是简单工厂模式的扩展,只是将咖啡工厂(具体工厂)中创建咖啡(具体产品)的方法定义为静态方法而已。

§2.1 代码变动

// 具体工厂: 咖啡工厂类
public class SimpleCoffeeFactory {
    public static Coffee createCoffee(String type) {
        Coffee coffee = null;
        if ("AmericanCoffee".equals(type)) {
            coffee = new AmericanCoffee();
        } else if ("LatteCoffee".equals(type)) {
            coffee = new LatteCoffee();
        } else {
            throw new RuntimeException("该产品暂未提供");
        }
        return coffee;
    }
}


// 咖啡店类
public class CoffeeStore {
    public Coffee orderCoffee(String type) {
        Coffee coffee = SimpleCoffeeFactory.createCoffee(type);
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }
}

§2.2 优点

  • 咖啡店(客户)在获取咖啡(具体产品)时,不需要创建咖啡工厂(具体工厂)对象,可以直接通过类名.方法名的方式来获取,避免创建多个工厂对象导致的资源浪费。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相控阵天线(七):常规平面阵列分布(矩形阵列、三角栅格、六边形阵列和圆形阵列)

目录简介矩形栅格平面阵列三角栅格平面阵列六边形阵列圆形平面阵列空心平面阵列简介 常见的平面阵有一些基本类型,按照栅格形式可以进行以下划分:矩形栅格、三角形栅格、同心圆环和椭圆环栅格等;按照边界形式可以进行以下划分:矩…

React Native Webview 中input type=file accept=“image/*“ 无法调起相机问题排查及解决

最近在写一个react native 项目&#xff0c;其中react-native-webview库一些使用着实遇到了不少问题&#xff0c;耗时比较长&#xff0c;现在和大家分享一下。 图片上传时选择拍照是很常见的功能&#xff0c;写的h5项目一直调用正常。使用方式大概如下&#xff1a; <input…

【数据结构】—— 双链表的增删改查

❤️一名热爱Java的大一学生&#xff0c;希望与各位大佬共同学习进步❤️ &#x1f9d1;个人主页&#xff1a;周小末天天开心 各位大佬的点赞&#x1f44d; 收藏⭐ 关注✅&#xff0c;是本人学习的最大动力 感谢&#xff01; &#x1f4d5;该篇文章收录专栏—数据结构 目录 双…

艾美捷小鼠肿瘤坏死因子α-ELISpot试剂盒使用指南

ELISpot Plus for enumeration of cells secreting TNF-α This kit is ideal for users who want a convenient and sensitive assay. The assay is designed for the enumeration of cells secreting mouse TNF-α. The kit includes ELISpot plates pre-coated with monocl…

[附源码]计算机毕业设计JAVA面试刷题系统

[附源码]计算机毕业设计JAVA面试刷题系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

【C++】--模拟实现vector

文章目录Constructors(构造函数)myvector()myvector(int n, const T& val T())myvector(InputIterator first, InputIterator last)拷贝构造交换函数myvector< T >& operator(myvector< T > v)迭代器扩容reserveresize插入和删除push_backpop_backinserte…

CDH启用kerberos 高可用运维实战

一、背景说明 在前的文章中介绍过《CDH集成的kerberos迁移实战》,由此也考虑到kerberos单节点可能引发的线上事故&#xff0c;所有考虑到把线上kerberos服务启用高可用。 二、环境介绍 系统版本 CentOS Linux release 7.6.1810 (Core) CM版本 Kerberos版本 三、实操…

桌面应用开发有哪些主流框架?

受益于开源技术的发展&#xff0c;以及响应快速开发的实际业务需求&#xff0c;跨平台开发不仅限于移动端跨平台&#xff0c;桌面端虽然在市场应用方面场景不像移动端那么丰富&#xff0c;但也有市场的需求。 相对于个人开发者而言&#xff0c;跨平台框架的使用&#xff0c;主要…

零基础学习下载FL Studio2023水果编曲软件

FL Studio工具常称水果编曲软件&#xff0c;是一款功能强大的编曲软件&#xff0c;集编曲&#xff0c;录音&#xff0c;剪辑&#xff0c;混音于一身&#xff0c;简单易上手&#xff0c;灵活性高&#xff0c;强大到突破想象。FL Studio&#xff0c;当前版本 FL Studio21&#xf…

Transductive Learning 和 Inductive Learning

简介 在 kipf-GCN 和 GraphSage 中&#xff0c;对 Transductive Learning 和 Inductive Learning 有了比较深刻的认识。 kipf-GCN 在其论文中提到算法属于 transductive node classification&#xff0c;也就是在训练节点embedding的时候要看到全图的节点&#xff0c;这是因为…

Linux——进程间通信(共享内存)

一、共享内存 1、定义 共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间&#xff0c;多个进程可以将其映射到自己的虚拟地址空间中。所有进程都可以访问共享内存中的地址&#xff0c;就好像它们是由malloc分配的一样。如果某…

47 - 父子间的冲突

---- 整理自狄泰软件唐佐林老师课程 1. 思考 子类中是否可以定义父类中的同名成员&#xff1f; 如果可以&#xff0c;如何区分&#xff1f;如果不可以&#xff0c;why&#xff1f; 1.1 编程实验&#xff1a;同名成员变量 #include <iostream> #include <string>…

操作系统导论--受限制的直接执行

受限直接执行 为了使程序尽可能快地运行&#xff0c;操作系统开发人员想出了一种技术——我们称之为受限的直接执行。 这个概念的“直接执行”部分很简单&#xff1a;只需直接在CPU上运行程序即可。因此&#xff0c;当OS希望启动程序运行时&#xff0c;它会在进程列表中为其创…

Packet Tracer - 排除单区域 OSPFv2 故障

地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 G0/0 172.16.1.1 255.255.255.0 不适用 S0/0/0 172.16.3.1 255.255.255.252 不适用 S0/0/1 192.168.10.5 255.255.255.252 不适用 R2 G0/0 172.16.2.1 255.255.255.0 不适用 S0/0/0 172.16.3.2 25…

slam定位学习笔记(六)

学习内容来自这篇文章&#xff0c;主要是将模块进行划分以及根据划分的模块对前面的代码结构进行调整。 一、模块划分 之前的文章主要介绍了这几个功能的实现&#xff1a;传感器时间同步、点云去畸变、实时显示点云、精度评价和前端里程计。将它们区分成三个模块&#xff1a;…

基于JSP的私人牙科医院管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86466989 主要使用技术 ServletJSPJSCSSMysql 功能介绍 登录注册模块&#xff1a;填写基本信息注册&#xff08;普通用户&#xff09;登录&#xff1b; 公告管理&#xff1a;公告增删改查&…

预训练模型分词方式

BPE、WordPiece、SentencePiece tokenize的目标是将输入的文本流&#xff0c; 切分成一个个子串&#xff0c;使得每个子串具有相对完整的语义&#xff0c;便于学习embedding表达和后续模型的使用。 tokenize三种粒度&#xff1a;word、subword、char word/词&#xff1a;最自…

Flutter高仿微信-第35篇-单聊-视频通话

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 目前市场上第三方视频接口的价格高的吓人 视频通话价格&#xff1a; 标清&…

代码随想录算法训练营day55 | 392.判断子序列,115.不同的子序列

392.判断子序列 参考代码随想录算法训练营第五十五天 |392. 判断子序列、115. 不同的子序列 - 掘金 暴力解法&#xff1a; Time Complexity: O(M*N) Space Complexity: O(N) class Solution:def isSubsequence(self, s: str, t: str) -> bool:start 0 #used to make sur…

[附源码]java毕业设计医院网上预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…