Java设计模式(九)—— 工厂模式1

news2024/12/23 20:20:49

系列文章目录

披萨订购—传统方式


文章目录

  • 系列文章目录
  • 前言
  • 一、传统方式案例
    • 1.具体需求案例
    • 2.传统方式实现
    • 3.传统方式优缺点
  • 总结


前言

Hello,小伙伴们,欢迎来到柚子的博客~让我们一起成长吧o( ̄▽ ̄)ブ


提示:以下是本篇文章正文内容,下面案例可供参考

一、传统方式案例

1.具体需求案例

我们来看一个披萨的项目:要便于披萨种类的扩展,要便于维护
(1)披萨的种类很多(比如 GreekPizz、CheesePizz等)
(2)披萨的制作有 prepare,bake,cut,box
(3)完成披萨店订购功能。
在这里插入图片描述

2.传统方式实现

在这里插入图片描述

(1)创建一个披萨抽象类:

public abstract class Pizza {
	//披萨名字
	protected String name;
	//准备原材料,不同的披萨不一样,因此,我们做成抽象方法
	public abstract void prepare();
	//烘烤
	public void bake() {
		System.out.println(name + " baking;");
	}
	//切块
	public void cut() {
		System.out.println(name + " cuting;");
	}
	//打包
	public void box() {
		System.out.println(name + " boxing;");
	}
	public void setName(String name) {
		this.name = name;
	}
}

分析: 这个类用来代表制作披萨的整个流程:准备阶段prepare()、烘烤阶段bake()、切割阶段cut()和打包阶段box() ,假设各个披萨的准备阶段需要的材料不一样,所以把准备阶段定义为一个抽象方法 ,其它三个阶段都一样。

(2)创建一个奶酪披萨类:

public class CheesePizza extends Pizza {
	@Override
	public void prepare() {
		//重写准备阶段方法
		System.out,println("给制作奶酪披萨 准备原材料");
	}
}

(3)创建一个希腊披萨类:

public class GreekPizza extends Pizza {
	public void prepare() {
		//重写准备阶段方法
		System.out,println("给制作希腊披萨 准备原材料");
	}
}

(4)创建一个订购披萨类:

public class OrderPizza {
	//构造器
	public OrderPizza() {
		Pizza pizza = null;
		String pizzaType;
		do {
			pizzaType = getType();
			if ("cheese".equals(pizzaType)) {
				pizza = new CheesePizza();
				pizza.setName("奶酪披萨");
			} else if ("greek".equals(pizzaType)) {
				pizza = new GreekPizza();
				pizza.setName("希腊披萨");
			} else {
				break;
			}
			//输出pizza 制作过程
			pizza.prepare();
			pizza.bake();
			pizza.cut();
			pizza.box();
		} while (true);
	}
	//写一个方法,可以获取希望订购的披萨种类
	private String getType(){
		try{
			BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("input pizza type:");
			String str = strin.readLine();
			return str;
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		}
	}
}

分析:订购披萨的逻辑代码写在了该类的构造器中,getType()方法是用来获取希望订购的披萨种类。但是,如果我们需要添加新的披萨,就需要从这个类中继续添加相应的逻辑语句,从而修改了订购披萨的这个类,就违反了OCP原则

(5)创建披萨订购运行类:

//相当于一个客户端,发出订购
public class PizzaStore {
	public static void main(String[] args) {
		new OrderPizza();
	}
}

3.传统方式优缺点

(1)优点是比较好理解,简单易操作。
(2)缺点是违反了设计模式的ocp模式,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码。
(3)比如我们这时要新增加一个Pizza的种类(Pepper胡椒披萨),我们要做如下修改。
在这里插入图片描述

//新增写
public class PepperPizza extends Pizza {
	@Override
	public void prepare() {
		System.out.println("给胡椒披萨准备原材料");
	}
}
//增加一段代码 OrderPizza.java //写
	if (orderType.equals("greek")) {
		pizza = new GreekPizza();
		pizza.setName("希腊披萨");
	} else if (orderType.equals("cheese")) {
		pizza = new CheesePizza(); 
		pizza.setName("奶酪披萨");
	} else if (orderType.equals("pepper")) {
		pizza = new PepperPizza();
		pizza.setName("胡椒披萨");
	} else {
		break;
	}
}

(4)改进的思路分析
分析: 修改代码可以接受,但是如果我们在其他的地方也有创建Pizza的代码,就意味着,也需要修改,而创建Pizza的代码,往往有多处
思路: 把创建Pizza对象封装到一个类中,这样我们有新的Pizza种类时,只需要修改类就可,其他有创建到Pizza对象的代码就不需要修改了——>简单工厂模式。


总结

披萨订购—传统方式


╭◜◝ ͡ ◜◝╮
( ˃̶͈◡˂ ̶͈ )感觉有用的话,欢迎点赞评论呀!
╰◟◞ ͜ ◟◞╯

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

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

相关文章

Java框架学习(一)JavaWeb基础:Maven、Spring、Tomcat、Mybatis、Springboot

文章目录 MavenMaven仓库Maven坐标为什么Maven进行了依赖管理,依然会出现依赖冲突?处理依赖冲突的手段是什么?详细讲讲scope依赖范围Maven的生命周期Maven高级分模块设计继承版本锁定聚合Maven的继承与聚合的异同私服 Tomcatservlet 分层解耦…

RISCV Reader笔记_4 乘除,浮点扩展

乘法和除法指令 前面了解过 RV32I不带乘除。扩展的RV32M里面有。 mul 较简单。div 是商,rem 是余数。 指令格式都差不多,基本就是靠 func 码确定变体。 因为两个32位数乘积是64位数,一条指令处理会比较复杂,因此分为两个指令计算…

二维地图中立体阴影效果实现

概述 前两天有个学员在群里发出来一张截图,效果是一个区域掩膜边框立体阴影效果,咨询我怎么实现,我看了下心里大概有了一个想法,只是前两天比较忙就没实现,趁着周末就想着验证实现一下。鉴于学员的要求,本…

116.实战网页实现平滑滚动

● 在导航中&#xff0c;我们使用#简单的实现了&#xff0c;现在我们要实现&#xff0c;点击导航自动跳转指定的节去&#xff0c;通过id去选择 <ul class"main-nav-list"><li><a class"main-nav-link" href"#how">工作流程&l…

Web APls-day01

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 变量声明 Web API 基本认知 1 作用和分类 2 什么是DOM 3 DOM树 4 DOM对象&#xff08;重要…

Powerbuilder项目文件太多,对象继承太多导致编译需要几个小时的解决方案

Powerbuilder项目文件太多&#xff0c;对象继承太多导致编译需要几个小时的解决方案&#xff1a; 项目文件太多&#xff0c;很多pbl是一个相对独立的库算法&#xff0c;而且还夹杂着pfc的一些老库。这些库的特点就是继承和封装比较好&#xff0c;但是导致编译速度特慢。我遇到…

全局异常处理

使用 ControllerAdvice 声明全局异常处理类使用ExceptionHandler(异常类.class) 指定哪一个异常处理 先会抛出指定异常&#xff0c;没有指定异常的情况下抛出全局异常。 3. 自定义异常 3-1. 自定义异常类&#xff0c;需要继承 extends RuntimeException 3-2. 在代码异常处声…

《JavaScript设计模式与开发实践》一篇文章带你读懂

《JavaScript设计模式与开发实践》是由曾探所著的一本经典技术书籍。该书详细介绍了JavaScript中常用的设计模式&#xff0c;并结合实际项目开发经验给出了实践示例和最佳实践建议。这本书首先介绍了设计模式的基本概念和作用&#xff0c;以及为什么要在JavaScript中使用设计模…

Leetcode链表刷题集合

链表 对链表类算法题做个小集合&#xff0c;题解基本来LeetCode题解与labuladong的算法网站&#xff0c;自己加以理解写注释。代码都是测试跑通的。 下面使用的链表结构&#xff1a; class ListNode{public ListNode next;public int val;public ListNode(ListNode next, in…

threejs光源

个人博客地址: https://cxx001.gitee.io 前言 没有光源&#xff0c;渲染场景将不可见。threejs中已经帮我们实现了大量的光源&#xff0c;我们可以直接使用&#xff0c;主要分为两类&#xff1a;基础光源和特殊光源&#xff0c;下面将依次详细介绍。 基础光源 1. THREE.Ambi…

单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法(matlab代码)

目录 1 主要内容 目标函数 电动汽车负荷建模 算例系统图 程序亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现博士文章《互动环境下分布式电源与电动汽车充电站的优化配置方法研究》第五章《单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法》…

13 | 代码模型(上):如何使用DDD设计微服务代码模型?

目录 DDD 分层架构与微服务代码模型 微服务代码模型 微服务一级目录结构 各层目录结构 1. 用户接口层 2. 应用层 3. 领域层 4. 基础层 代码模型总目录结构 总结 上一篇文章中完成了领域模型的设计&#xff0c;接下来我们就要开始微服务的设计和落地了。那微服务落地时…

第十七章、Spring的事务处理

1.什么是事务&#xff1f; 保证业务操作完整性的一种数据库机制事务的特点&#xff1a;ACID 原子性 一致性 隔离性 持久性2.如何控制事务 JDBC:Connection.setAutoCommit(false);事务开启Connection.commit();Connection.rollback(); Mybatis:Mybatis自动开启事务sqlSession(…

Revit中桩的绘制及CAD生成桩

一、Revit如何用体量来绘制一个桩基础 如何用体量来绘制一个桩基础呢?这里采用BIM等级考试一级第十期的第三题来教大家 新建体量样板&#xff0c;选择公制体量来绘制 按题目要求先复制4个参照标高平面&#xff0c;同时按住ctrlshift拖动标高再修改高度就可以 开始绘制基础的最…

Axure教程——模糊搜索(中继器 )

本文介绍的是用Axure中的中继器制作模糊搜索 效果 预览地址&#xff1a;https://f16g7e.axshare.com 功能 输入关键字&#xff0c;可查询出相应的结果 制作 一、需要元件 矩形、中继器 二、制作过程 1、搜索框 拖入一个矩形元件&#xff0c;设置大小为21530,在矩形中加入一个…

多元分类预测 | Matlab麻雀算法(SSA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,SSA-HKELM分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab麻雀算法(SSA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,SSA-HKELM分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab…

内网IP怎么用域名让外网访问,域名动态解析和静态区别?

域名解析是将域名与公网IP进行对应关系&#xff0c;实现访问域名即访问到对应IP应用的方式。域名解析分静态域名解析和动态域名解析的区别&#xff0c;它们的区别在哪&#xff1f;内网IP服务器怎么用域名让外网连接访问&#xff1f;这些都是需要我们有所了解掌握的。 这里不但…

ShardingSphere 5.3 整合 Seata 分布式事务 | Spring Cloud 61

一、前言 通过以下系列章节&#xff1a; docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

word去掉页眉横线方法

最简单的方法&#xff1a;双击页眉全选文字&#xff0c;然后点清除样式即可。 清除样式的图标&#xff1a; 参考的是下面这篇文章&#xff0c;介绍得很详细&#xff0c;讲了三种方法&#xff0c;如果上面的方法行不通可以试试其他的方法&#xff1a; Word页眉横线怎么去掉

2023年第二届能源与环境工程国际会议(CFEEE 2023)

会议简介 Brief Introduction 2023年第二届能源与环境工程国际会议(CFEEE 2023) 会议时间&#xff1a;2023年9月1日-3日 召开地点&#xff1a;中国三亚 大会官网&#xff1a;CFEEE 2023-2023 International Conference on Frontiers of Energy and Environment Engineering 由I…