工厂方法模式(java)

news2024/11/30 1:48:52

目录

结构

案例

类图

 代码实现

抽象咖啡工厂

美式咖啡工厂

拿铁咖啡工厂

咖啡类(抽象产品类)

美式咖啡 

拿铁咖啡

咖啡店类

测试类

优缺点 

优点

缺点


结构

工厂方法模式的主要角色:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。

  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

案例

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

类图

 代码实现

抽象咖啡工厂

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 咖啡工厂
 * @date: 2023/7/18 16:27
 */
public interface CoffeeFactory {
    // 创建咖啡对象
    Coffee createCoffee();

}

美式咖啡工厂

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 美式咖啡工厂
 * @date: 2023/7/18 16:29
 */
public class AmericanCoffeeFactory implements CoffeeFactory {

    @Override
    public Coffee createCoffee() {
        return new AmericanCoffee();
    }

}

拿铁咖啡工厂

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 拿铁咖啡工厂
 * @date: 2023/7/18 16:31
 */
public class LatterCoffeeFactory implements CoffeeFactory{

    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }
}

咖啡类(抽象产品类)

package factory_method;

/**
 * @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 factory_method;

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

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

}

拿铁咖啡

package factory_method;

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

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

咖啡店类

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 咖啡店类
 * @date: 2023/7/18 16:33
 */
public class CoffeeStore {
    private CoffeeFactory factory;

    // 设置工厂
    public void setFactory(CoffeeFactory factory){
        this.factory = factory;
    }

    // 制作咖啡
    public Coffee orderCoffee(){
       Coffee coffee =   factory.createCoffee();

       // 加配料
       coffee.addMilk();
       coffee.addSuger();

       return coffee;
    }

}

测试类

package factory_method;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 测试类
 * @date: 2023/7/18 16:38
 */
public class Client {

    public static void main(String[] args) {

        // 创建美式咖啡工厂对象
        CoffeeFactory factory = new AmericanCoffeeFactory();
        // 创建咖啡店对象
        CoffeeStore store = new CoffeeStore();
        // 设置工厂
        store.setFactory(factory);

        // 点咖啡
        Coffee coffee  = store.orderCoffee();
        System.out.println(coffee.getName());

    }

}

优缺点 

优点

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程

  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则

缺点

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

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

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

相关文章

MySQL常用语句

目录 连接MySQL 数据库操作 表的操作 数据操作 进阶查询 源码等资料获取方法 连接MySQL -- 语法:mysql -u用户名 -p密码 注:--空格 起到注释的作用 mysql -uroot -p123456 数据库操作 -- 显示当前时间、用户名、数据库版本(可以单独…

NodeJS实现支付宝沙箱支付②③

文章目录 前言版权声明Alipay SDK 沙箱环境简介Node环境要求沙箱环境配置下载所需模块准备前端静态页面以及Node服务器文件夹规范AlipaySdk 配置准备AlipaySdk 代码演示 Alipay实例化 ~ alipay.sdk 文件 AlipayForm ~ alipayForm文件 AlipayFormStatus ~ alipayForm文件 …

MQTT协议在物联网环境中的应用及代码实现解析(四)

四、使用单片机环境编程接收MQTT服务器上特定主题的信息 以下是使用STM32F103单片机链接W5500芯片链接到网络上,利用MQTT协议接收MQTT服务器“mqtt.laobai.net”上的“laobai_topic001”主题上的订阅信息,并发送给串口的C语言代码示例,包括完…

C语言——指针详解(进阶)

轻松学会C语言指针 一、字符指针二、数组指针2.1 数组指针的定义2.2 &数组名VS数组名2.3 数组指针的使用 三、指针数组四、数组参数和指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 五、函数指针六、函数指针数组七、指向函数指针数组的指针八…

计算机网络微课堂学习笔记(详细图解讲解)-长期更新

前言: 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施,计算机网络已经像水、电、煤气这些基础设施一样,成为我们生活中不可或缺的一部分 一、因特网概述 (1)网络、…

ChatGPT火热之下的冷思考

作为一款基于人工智能的自然语言处理(NLP)​​聊天机器人​​程序,ChatGPT通过大量来自互联网的文本进行训练,并使用深度学习和机器学习算法来理解用户的问题并提供准确的回答。并且,ChatGPT还内置了情感分析、关键字提取和实体识别等功能&am…

ngsoc使用指南

和威胁告警差不多。 ngsoc是以资产为核心,以安全事件为管理的关键流程,建立一套威胁检测,相应,预测,和持续监控分析,一体化的监控与相应平台。 和天眼的区别:会把天眼的告警,其他安…

【041】从零开始:逐步学习使用C++ STL中的stack容器

从零开始:逐步学习使用C STL中的stack容器 引言一、stack容器概述二、stack容器常用API2.1、构造函数2.2、赋值操作2.3、数据存取操作2.4、大小操作 三、使用stack容器实现一个高效的算法总结 引言 💡 作者简介:一个热爱分享高性能服务器后台…

安达发|如何选择更适合我们的APS高级排程软件

如何选择aps高级排程公司更适合我们?在选购aps高级排程的时候,一些朋友由于不清楚其中的选购技巧,许多时候会掉入些许选择误区,导致我们买不了合适我们选择的aps高级排程。因此选择适合我们的aps高级排程就变得十分重要,唯有明白…

23.JavaWeb-集群+Nginx+JMeter

1.集群概念 平时用的服务是的并发量是有限的,像tomcat只有不到500的并发量,不能满足高并发的需求,因此就采用了集群的方法,用多个服务器 当用户请求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而…

项目中使用拆分数据库的优势

为什么要拆分数据库? 取决于数据库的负载和数据量。 单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统、文书系统、ERP系统、OA系统,用一个MySQL数据库实例基本就够用了。 就…

重绘 ( Repaint) 和回流 ( Reflow)

重绘 ( Repaint) 和回流 ( Reflow) 首先了解 重绘 ( Repaint) 和回流 ( Reflow)其实是关乎到浏览器性能的问题 重绘和回流是渲染步骤中的⼀⼩节,但是这两个步骤对于性能影响很大 重绘和回流的过程都需要浏览器耗费大量的计算资源,过多的使用会导致网页性…

港联证券|熨平短期扰动 7月MLF小额加量续作

7月17日,为保护银行系统流动性合理充裕,人民银行开展1030亿元中期借贷便利(MLF)操作和330亿元公开商场逆回购操作,充沛满足了金融机构需求。本月MLF中标利率和公开商场逆回购操中标利率与上期持平,分别为2.65%、1.9%。…

[深度学习入门]什么是神经网络?[神经网络的架构、工作、激活函数]

目录 一、前言二、神经网络的架构——以手写数字识别三、神经网络的工作1、单输入单输出感知器函数2、二维输入参数3、三维输入参数 四、激活函数1、激活函数2、ReLU激活函数3、非线性激活函数(1)二输入二输出的神经网络的架构(2)…

创建、发布npm包,并且应用在项目里面

实现一个函数去监听dom宽高的变化,并且发布NPM包,然后使用到项目中 步骤 1.5W3H 八何分析法 2.如何监听dom宽高变化 3.如何用vite 打包库 4.如何发布npm 一、NPM包新建过程 查看完整目录 1.生成 package.json npm init生成TS配置文件 tsconfig.js…

OpenVas扫描器更新扫描引擎

OPenvas扫描器安装时step1 是交换指导升级(nvt,cert,scap),这次升级后是自动升级24h升级一次,但第一次升级时选择默认的rsync升级时会出现同步失败的问题,导致openvas安装完后有很大模块和规则不…

软件测试教程之测试分类

目录 1.按测试对象分类 界面测试 可靠性测试 容错性测试 文档测试 兼容性测试 易用性测试 安装卸载测试 性能测试 安全性测试 内存泄漏测试 2.按照是否查看代码分类 黑盒测试 白盒测试 灰盒测试 3.按开发阶段划分 单元测试 集成测试 系统测试 回归测试 冒…

栈的压入、弹出序列

链接: 栈的压入、弹出序列 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param pushV int整型vector * param popV int整型vector * return bool布尔型*/bool IsPopOrder(vector<int…

视频制作高清GIF动图的简单方法分享

有时想要将电视剧、电影中的精彩画面保存下来&#xff0c;但是视频较大非常的不方便的时候该怎么办呢&#xff1f;这时候&#xff0c;可以使用专业的视频转gif&#xff08;https://www.gif.cn/&#xff09;工具-GIF中文网&#xff0c;无需下载软件&#xff0c;手机、pc均可在线…

【深度学习平台推荐】 Kaggle

工欲善其事&#xff0c;必先利其器。在一个优秀的平台上&#xff0c;更利于深度学习的探究。 本文目的是推荐一些深度学习相关的网站。 1 Kaggle Kaggle offers a no-setup, customizable, Jupyter Notebooks environment. Access GPUs at no cost to you and a huge repositor…