简单工厂模式(java)

news2024/7/5 22:58:31

目录

结构

案例

类图

代码实现

简单咖啡工厂类

 咖啡店类

 咖啡类

具体咖啡类

简单工厂方法的优缺点

优点

缺点


结构

简单工厂包含如下角色:

抽象产品 :定义了产品的规范,描述了产品的主要特性和功能。
具体产品 :实现或者继承抽象产品的子类
具体工厂 :提供了创建产品的方法,调用者通过该方法来获取产品。

案例

需求:设计一个咖啡店点餐系统。

设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。

类图

代码实现

简单咖啡工厂类

package coffee_produce;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 简单咖啡工厂
 * @date: 2023/7/18 14:40
 */
public class SimpleCoffeeFactory {

    public  Coffee cratateCoffee(String type){

          Coffee coffee = null;
          if("美式咖啡".equals(type)){
              coffee = new AmericanCoffee();
          }
          else if("拿铁咖啡".equals(type)) {
              coffee = new LatteCoffee();
          }
          else {
              System.out.println("对不起,你点的咖啡不存在");
              return null;
          }
            return coffee;
    }

}

 咖啡店类

package coffee_produce;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 咖啡店类
 * @date: 2023/7/18 14:52
 */
public class CoffeeStore {

    public Coffee orderCoffee(String type, String add){

        // 创建咖啡工厂
        SimpleCoffeeFactory factory = new SimpleCoffeeFactory();
        // 制作咖啡
         Coffee coffee =  factory.cratateCoffee(type);

        if ("加糖" .equals(add) )  coffee.addMilk(); // 加奶
        else if("加奶" .equals(add))  coffee.addSuger(); // 加糖
        else System.out.println("无需加配料");

        return coffee;
    }

}

 咖啡类

package coffee_produce;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 咖啡类
 * @date: 2023/7/18 14:43
 */
public abstract class  Coffee {

    public abstract String getName();

    public  void addMilk(){System.out.println("加奶");}

    public void  addSuger(){
        System.out.println("加糖");
    }

}

具体咖啡类

package coffee_produce;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 美式咖啡
 * @date: 2023/7/18 14:47
 */
public class AmericanCoffee extends Coffee{

    public  String getName(){
        return "美式咖啡";
    }

}
package coffee_produce;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 拿铁咖啡
 * @date: 2023/7/18 14:59
 */
public class LatteCoffee extends Coffee{

    public String getName(){
        return "拿铁咖啡";
    }
}

简单工厂方法的优缺点

优点

封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。

缺点

增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。

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

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

相关文章

前端 | (五)CSS三大特性及常用属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源:尚硅谷前端htmlcss零基础教程,2023最新前端开发html5css3视频 文章目录 📚CSS三大属性🐇层叠性🐇继承性🐇优先级 📚CSS常用属性🐇像素的概念🐇颜色的表示⭐️表…

OCR学术前沿及产业应用高峰论坛202204

OCR学术前沿及产业应用高峰论坛 相关议程:https://mp.weixin.qq.com/s/LYoKHFad9D-gjhGlVF3Czg 广告OCR技术研究与应用-腾讯 视频制作ASR,ocr得到字幕 计算机动画CG OCR实践与技术创新 - 蚂蚁 loss优化 数据合成 对比学习的方式,什么样是…

让小程序动起来-轮播图的两种方式--【浅入深出系列002】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择啥是轮播图轮播图的关键代码最常见的轮播图代码便于理解的轮播代码两种轮播代码的比较 实际操练第一步,就是找到文件。第二步,先改动一下最显眼…

springboot整合feign实现RPC调用,并通过Hystrix实现降级

目录 一、服务提供者 二、服务消费者 三、测试效果 四、开启Hystrix实现降级功能 feign/openfeign和dubbo是常用的微服务RPC框架,由于feigin内部已经集成ribbon,自带了负载均衡的功能,当有多个同名的服务注册到注册中心时,会根…

数组前缀和

前缀和 前缀和就是指前缀的和,例如在数组中,从开始到 i 就是到 i 的前缀和。前缀和一般用来求中间连续某一段的和,例如sum[i] - sum[j - 1]就可以求出j 到 i 这一段的和。 在这一道题目里面,中间某一段连续子数组和为k&#xff0…

知识库分享|《快手电商中小商家成长指南》

《快手电商中小商家成长指南》致力于帮助快手电商平台的新商家、中小商家可以快速掌握电商经营流程,理解电商经营方法,提升电商经营能力,助力中小商家快速实现冷启。 ‼️ 包含中小商家冷启必备的六大板块两大方向: 基础操作、账…

SpringCloud(三)LoadBalancer负载均衡

一、负载均衡 实际上,在添加LoadBalanced注解之后,会启用拦截器对我们发起的服务调用请求进行拦截(注意这里是针对我们发起的请求进行拦截),叫做LoadBalancerInterceptor,它实现ClientHttpRequestIntercep…

JAVA的swing技术到底实用不实用?

文章目录 先说结论JAVA的知识范围那为什么还要学? 总结 先说结论 不实用 1 尚硅谷Java入门视频教程,宋红康java基础视频 必须要排在第一位。1600万的播放量呀。 717集 我的天啦! 目录: Java视频及配套资料下载指南 尚硅谷Java基…

有效的括号(C)

bool isValid(char* s) {ST st;StackInit(&st);while (*s) //遍历 -- 与\0终止{//是左括号 压栈if (*s ( || *s [ *s {){StackPush(&st, *s);s;}else{//应对样例: ’]if (StackEmpty(&st)){StackDestroy(&st);return false;}//不是左括号 应该就…

【Flink】详解Flink任务提交流程

启动一个任务 通常我们会使用 bin/flink run -t yarn-per-job -c com.xxx.xxx.WordCount/WordCount.jar 方式启动任务;我们看一下 flink文件中到底做了什么,以下是其部分源码 # Convert relative path to absolute path bindirname "$target"…

快速搭建机器学习demo: gradio教程

1. Intro gradio是一个能够快速建立机器学习demo web应用的工具,仅需简单的几行代码就能构建机器学习模型的可视化交互demo,并分享给你的朋友使用。 与gradio相同功能的竞品有Streamlit,相比Gradio,Streamlit相对复杂&#xff0…

热门二叉树面试题

606. 根据二叉树创建字符串 - 力扣(LeetCode) 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&a…

Baichuan-13B:130亿参数的开源语言模型,引领中文和英文benchmark

Baichuan-13B: 一个强大的开源大规模语言模型 标题:Baichuan-13B:130亿参数的开源语言模型,引领中文和英文benchmark Baichuan-13B是由百川智能开发的一个开源大规模语言模型项目,包含了130亿参数。该模型在中文和英文的权威ben…

基于Nginx深入浅出亿级流量架构设计(更新至2023.7.18)

基于Nginx深入浅出亿级流量架构设计 环境准备/安装部署Nginx四个发行版本简单介绍Nginx的安装 Nginx的目录结构与基本运行原理及其最小配置解析Nginx虚拟主机与域名配置ServerName匹配规则反向代理在系统结构中的应用场景Nginx的反向代理配置基于反向代理的负载均衡器 环境准备…

自洽性改善语言模型中的思维链推理

自洽性改善语言模型中的思维链推理 摘要介绍对多样化路径的自洽实验实验设置主要结果当CoT影响效率时候,SC会有所帮助与现有方法进行比较附加研究 相关工作总结 原文: 摘要 本篇论文提出了一种新的编码策略——自洽性,来替换思维链中使用的…

【STM32】SPI屏幕刷图总结:GPIO模拟,硬件SPI,DMA+硬件SPI

文章目录 GPIO模拟SPI硬件SPI外设DMA硬件SPI外设总结 代码工程:https://github.com/liefyuan/stm32-spi-st7789-tft.git 前言 我的屏幕的分辨率是:240*320 驱动是:ST7789V 线驱动方式:四线SPI(CS,DC&#…

206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3: 输入&am…

PageObject+Python+Appium

目录 前言: 简介 功能 常用目录 配置 实例 - 第一次启动 app 实例 - 登录 代码入口实例 结果展示 前言: Page Object模式是一种常用的设计模式,用于组织和管理自动化测试脚本中的页面对象。它将页面的元素和操作封装在一个独立的类…

数据质量相关问题系列

数据质量问题是什么? 数据质量,是指在业务环境下,数据符合数据消费者的使用目的,能满足业务场景具体需求的程度。而数据质量问题是指数据集中存在无法容忍的缺陷,从而降低该数据的可靠性和可信度。简单理解就是数据很脏…

【JAVA】云HIS系统功能菜单知识(一)

一、云HIS特色 云HIS滚动消息栏:质控消息、住院时长、药库结转、患者入院、医嘱停止、新开医嘱、门诊用药不良、出院审核、药品调拨、排班提醒、药品库存、药品过期、药品临期等帮助医生、护士和相关管理人员实时接收院内消息并作出处理。 二、云HIS功能菜单 【预约…