简单工厂模式(java)

目录

结构

案例

类图

代码实现

简单咖啡工厂类

 咖啡店类

 咖啡类

具体咖啡类

简单工厂方法的优缺点

优点

缺点


结构

简单工厂包含如下角色:

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

案例

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

设计一个咖啡类(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.hqwc.cn/news/28573.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot Helper插件免费版的下载

在使用idea的社区版的时候,我们创建springboot项目就要下载springboot helper插件,下载是很简单,但是呢,有一个问题就是: 可以看到它是收费的,要想免费创建spring boot项目那么我们第一可以采用网页版创建&…

Java线程池

目录 线程池 一、Java构建线程的方法 二、线程池的7个参数 三、线程池的执行流程 四、线程池属性标识 4.1.核心属性 4.2.线程池状态变化 五、线程池的 execute 方法执行 六、Worker的封装 七、线程执行的后续处理 线程池 线程池ThreadPoolExecutor源码剖析 // Execu…

B071-项目实战-用户模块--手机注册 管理员登录

目录 完成注册功能后端开发完成UserControllerUserServiceImplLogininfoMapper 前端页面完成绑定数据绑定事件准备登录页 管理员登录1需求分析登录设计页面设计表设计流程设计所需技术 员工新增级联操作登录信息EmployeeServiceImplShopServiceImpl 管理员登录2前端页面后端接口…

MacOS使用USB接口与IPhone进行Socket通信

演示效果如下: 开源地址: GitHub - rsms/peertalk: iOS and Mac Cocoa library for communicating over USB 克隆源码: git clone https://github.com/rsms/peertalk.git 克隆后打开peertalk然后启动xcode工程 先启动MacOS服务端工程,再启动iOS客户端工程 客户端 服务端

php代码逻辑题

<?php error_reporting(0); show_source(__FILE__); $guess $_POST[guess]; $data (array)json_decode($_GET[data]); if(substr(md5($guess),0,27)797ed5077436dc8abaec64750e2)if ($data[aaa] !666 && intval($data[aaa],0) 666 &‮⁦!!⁩⁦& "h…

AtcoderABC249场

A - JoggingA - Jogging 题目大意 高桥和青木一起慢跑&#xff0c;高桥每隔 ACAC 秒钟走 BB 米&#xff0c;然后休息 CC 秒钟&#xff0c;青木每隔 DFDF 秒钟走 EE 米&#xff0c;然后休息 FF 秒钟。现在已经过去了 XX 秒钟&#xff0c;问谁跑得更远。 思路分析 模拟来解决这…

mysql 1 -- 数据库介绍、mysql 安装及设置

Linux 安装 mysql 1、数据库&#xff08;mysql&#xff09; 数据文件 - 数据库过了系统 2、c/s mysql 服务器 mysql 客户端 ip port : 3306 3、关系型 于 非关系型数据库&#xff08;nosql&#xff09; nosql可以解决一些关系型数据库所无法实现的场景引用。 一、数据库介绍 …

VScode 右键菜单加入使用用VSCode打开文件和文件夹【Windows】

VScode 右键菜单加入使用用VSCode打开文件和文件夹【Windows】 介绍修改注册表添加右键打开文件属性修改注册表添加右键打开文件夹属性修改注册表添加右键空白区域属性 介绍 鼠标右击文件或者文件夹&#xff0c;可直接用VSCode打开&#xff0c;非常方便。但如果我们在安装VSCo…

「网络编程」传输层协议_ UDP协议学习_及原理深入理解

「前言」文章内容大致是传输层协议&#xff0c;UDP协议讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、传输层二、UDP协议2.1 再谈端口号2.2.1 端口号范围划分2.2.2 认识知名端口号2.2.3 端口号注意问题2.2.4 netstat命令和pidof命令 2.2 UD…

设计模式之享元模式

写在前面 本文看下一种结构型设计模式&#xff0c;享元模式。 1&#xff1a;介绍 1.1&#xff1a;什么时候使用享元模式 当程序需要大量的重复对象&#xff0c;并且这些大量的重复对象只有部分属性不相同&#xff0c;其他都是相同的时候&#xff0c;就可以考虑使用享元设计…

STM32之按键驱动的使用和自定义(MultiButton)

原始Github地址 Github地址 修改后 调整内容 将宏定义转换成配置结构体 头文件 #ifndef _MULTI_BUTTON_H_ #define _MULTI_BUTTON_H_#include "stdint.h" #include "string.h"//According to your need to modify the constants. //#define TICKS_IN…

Redis实战案例19-Redis解决主从一致性问题

主节点&#xff08;Master&#xff09;“写操作”&#xff1a; 接收并响应客户端的读写请求。持久化数据到磁盘&#xff08;根据配置可以选择使用RDB快照或者AOF日志&#xff09;。将自己的写操作同步给所有的从节点。处理发布/订阅&#xff08;Pub/Sub&#xff09;模式中的发…