当前位置: 首页 > news >正文

《HeadFirst设计模式(第二版)》第四章代码——工厂模式

代码文件目录结构:

Cheese:

原料ingredient类中只以Cheese为例,不重复展示:

package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;/*** @Author 竹心* @Date 2023/8/4**/public abstract class Cheese {String name;String getName(){return name;}
}
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;/*** @Author 竹心* @Date 2023/8/4**/public class NYCheese extends Cheese{public NYCheese() {name = "NYCheese";}
}
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;/*** @Author 竹心* @Date 2023/8/4**/public class ChicagoCheese extends Cheese{public ChicagoCheese(){name = "ChicagoCheese";}
}
PizzaIngredientFactory
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;/*** @Author 竹心* @Date 2023/8/4**/public interface PizzaIngredientFactory {public Dough createDough();public Sauce createSauce();public Cheese createCheese();public Clams createClams();
}
NYPizzaIngredientFactory 
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;/*** @Author 竹心* @Date 2023/8/4**/public class NYPizzaIngredientFactory implements PizzaIngredientFactory{@Overridepublic Dough createDough() {return new NYDough();}public Sauce createSauce(){return new NYSauce();}@Overridepublic Cheese createCheese() {return new NYCheese();}@Overridepublic Clams createClams() {return new NYClams();}
}
ChicagoPizzaIngredientFactory
package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;/*** @Author 竹心* @Date 2023/8/4**/public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory{@Overridepublic Dough createDough() {return new ChicagoDough();}public Sauce createSauce(){return new ChicagoSauce();}@Overridepublic Cheese createCheese() {return new ChicagoCheese();}@Overridepublic Clams createClams() {return new ChicagoClams();}
}
Pizza
package Chapter4_FactoryPattern.abstractFactoryPattern.Products;import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.*;/*** @Author 竹心* @Date 2023/8/4**/public abstract class Pizza {String name;Dough dough;Sauce sauce;Cheese cheese;Clams clams;public abstract void prepare();public void bake(){System.out.println("Bake for 25 minutes at 350");}public void cut(){System.out.println("Cutting the pizza into diagonal slices");}public void box(){System.out.println("place pizza in official PizzaStore box");}public String getName(){return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Pizza{" +"name='" + name + '\'' +", dough=" + dough +", sauce=" + sauce +", cheese=" + cheese +", clams=" + clams +'}';}
}
CheesePizza
package Chapter4_FactoryPattern.abstractFactoryPattern.Products;import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.PizzaIngredientFactory;/*** @Author 竹心* @Date 2023/8/4**/public class CheesePizza extends Pizza{PizzaIngredientFactory ingredientFactory;public CheesePizza(PizzaIngredientFactory ingredientFactory){//在初始化的时候确定是哪一种品味(通过原料工厂)this.ingredientFactory = ingredientFactory;}@Overridepublic void prepare() {System.out.println("preparing "+name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();}
}
ClamPizza
package Chapter4_FactoryPattern.abstractFactoryPattern.Products;import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.PizzaIngredientFactory;/*** @Author 竹心* @Date 2023/8/4**/public class ClamPizza extends Pizza{PizzaIngredientFactory ingredientFactory;public ClamPizza(PizzaIngredientFactory ingredientFactory){this.ingredientFactory = ingredientFactory;}@Overridepublic void prepare() {System.out.println("preparing "+name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();clams = ingredientFactory.createClams();}
}
PizzaStore
package Chapter4_FactoryPattern.abstractFactoryPattern;import Chapter4_FactoryPattern.abstractFactoryPattern.Products.Pizza;/*** @Author 竹心* @Date 2023/8/4**/public abstract class PizzaStore {public Pizza orderPizza(String type){Pizza pizza;pizza = createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}protected abstract Pizza createPizza(String type);}
NYPizzaStore
package Chapter4_FactoryPattern.abstractFactoryPattern;import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.NYPizzaIngredientFactory;
import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.PizzaIngredientFactory;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.CheesePizza;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.ClamPizza;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.Pizza;/*** @Author 竹心* @Date 2023/8/4**/public class NYPizzaStore extends PizzaStore {protected Pizza createPizza(String item){Pizza pizza = null;PizzaIngredientFactory ingredientFactory =new NYPizzaIngredientFactory();if(item == "cheese"){pizza = new CheesePizza(ingredientFactory);pizza.setName("New York Style Cheese Pizza");}else if(item =="clam"){pizza = new ClamPizza(ingredientFactory);pizza.setName("New York Style Clam Pizza");}return pizza;}
}
ChicagoPizzaStore
package Chapter4_FactoryPattern.abstractFactoryPattern;import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.ChicagoPizzaIngredientFactory;
import Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient.PizzaIngredientFactory;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.CheesePizza;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.ClamPizza;
import Chapter4_FactoryPattern.abstractFactoryPattern.Products.Pizza;/*** @Author 竹心* @Date 2023/8/4**/public class ChicagoPizzaStore extends PizzaStore {@Overrideprotected Pizza createPizza(String item) {Pizza pizza = null;PizzaIngredientFactory ingredientFactory =new ChicagoPizzaIngredientFactory();if(item == "cheese"){pizza = new CheesePizza(ingredientFactory);pizza.setName("Chicago Style Cheese Pizza");}else if(item =="clam"){pizza = new ClamPizza(ingredientFactory);pizza.setName("Chicago Style Clam Pizza");}return pizza;}
}
PizzaTestDrive
package Chapter4_FactoryPattern.abstractFactoryPattern;import Chapter4_FactoryPattern.abstractFactoryPattern.Products.Pizza;/*** @Author 竹心* @Date 2023/8/4**/public class PizzaTestDrive {public static void main(String[] args) {PizzaStore nyStore = new NYPizzaStore();PizzaStore chicagoStore = new ChicagoPizzaStore();Pizza pizza = nyStore.orderPizza("cheese");System.out.println("Ethan ordered a "+pizza.getName()+'\n');pizza = chicagoStore.orderPizza("cheese");System.out.println("Joel ordered a "+pizza.getName()+'\n');}
}
notes:
简单工厂模式:就是将平常的new过程封装成一个类来实现工厂方法模式:定义一个创建对象的接口,但是由它的子类决定要实例化哪个类。工厂方法让类把实例化推迟到子类这里的“决定”其实是表示用哪个接口子类来创建产品。抽象工厂模式:提供一个接口,用于创建相关或者依赖对象的家族,而不必指定他们的具体类
运行结果:

 

相关文章:

《HeadFirst设计模式(第二版)》第四章代码——工厂模式

代码文件目录结构: Cheese: 原料ingredient类中只以Cheese为例,不重复展示: package Chapter4_FactoryPattern.abstractFactoryPattern.Ingredient;/*** Author 竹心* Date 2023/8/4**/public abstract class Cheese {String name;String g…...

拖拽宫格vue-grid-layout详细应用及案例

文章目录 1、前言2、安装3、属性4、事件5、占位符样式修改6、案例 1、前言 vue-grid-layout是一个适用于vue的拖拽栅格布局库,功能齐全,适用于拖拽高度/宽度自由调节的布局需求,本文将讲述一些常用参数和事件,以及做一个同步拖拽…...

sanyo三洋摄像机卡有部分坏块恢复案例

sanyo三洋,这个品牌的摄像机真的是罕见。实际上日系摄像机领域就两个公司,一个是佳能一个索尼,其它的都厂商基本上全是用这两家公司的方案,当然松下这个怪咖除外!下面我们看看三洋的恢复案例。 故障存储:16G SD卡 故…...

【C++】STL——set和map及multiset和multiset的介绍及使用

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C 🛹Linux 📕 学习格言:博观而约取&#xff0…...

帕累托森林:IEEE Fellow唐远炎院士出任「儒特科技」首席架构官

导语 「儒特科技」作为一家拥有全球独创性极致化微内核Web引擎架构的前沿科技企业,从成立即受到中科院软件所和工信部的重点孵化及扶持,成长异常迅速。前不久刚正式官方融入中国五大根操作系统体系,加速为其下游上千家相关衍生OS和应用软件企…...

数据库大数据

数据库 PyMongo模块的使用-MongoDB的Python接口 MapReduce将数据分解成子集,在不同机器上分开处理,并把结果集合起来,从而处理大数据的泛化框架。 Hadoop是MapReduce的一种实现,类似于C++是面向对象编程的实现一样。 NoSQL-Not Only SQL,技能能更新颖,更高效地访问(如…...

骨传导耳机是怎么工作的?骨传导耳机是智商税产品吗?

骨传导耳机是怎么工作的?骨传导耳机是智商税产品吗? 骨传导耳机是怎么工作的? 骨传导耳机的传声方式跟传统耳机完全不同,骨传导耳机就是利用骨传导的原理是直接将人体骨结构作为传声介质,通过颅骨来进行声音传播的&am…...

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业tbms

​ 功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查…...

算法-合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 输入:intervals [[1,3],[2,6],[8,10],[15,…...

布基纳法索ECTN(BESC)申请流程

根据BURKINA FASO布基纳法索签发于 11/07/2006法令编号 00557的规定: 自2006年11月07 日起所有出口至布基纳法索(Burkina Faso)的货物,必须申请ECTN/BESC。ECTN是ELECTRONIC CARGO TRACKING NOTE的英文缩写,BESC是BORDEREAU DE SU…...

CDN安全面临的问题及防御架构

CDN安全 SQL注入攻击(各开发小组针对密码和权限的管理,和云安全部门的漏洞扫描和渗透测试) Web Server的安全(运营商和云安全部门或者漏洞纰漏第三方定期发布漏洞报告修复,例如:nginx版本号和nginx resol…...

【MySQL】MySQL管理 (十四)

🚗MySQL学习第十四站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 一.系统数据库 MySQL8.0数据库安装完成后,自带了一下四个数据库,具体作用如下: 数据含…...

Mybatis:一对一查询映射处理

Mybatis:一对一查询映射处理 前言一、概述二、创建数据模型三、 问题四、解决方案1、方案一:级联方式处理映射关系2、方案二:使用association处理映射关系3、方案三:分步查询 前言 本博主将用CSDN记录软件开发求学之路上亲身所得…...

九、用 ChatGPT 提高算法和编程能力

目录 一、实验介绍 二、背景 三、LeetCode 刷题带来的问题 四、ChatGPT 如何帮助刷题 五、ChatGPT 推荐学习资源...

【数模】主成分分析PCA

主成分分析(Principal Component Analysis,PCA),是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能反映出原始数据的大部分信息。使用场景:一般…...

全志F1C200S嵌入式驱动开发(从DDR中截取内存)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 linux内核起来的时候,不一定所有的内存都是分配给linux使用的。有的时候,我们是希望能够截留一部分内存的。为什么保留这部分内存呢?这里面可以有很多的用途。比如说,第一,如果…...

C++中点云聚类算法的实现与应用探索

第一部分:C中点云聚类算法的实现与应用 在当今的计算机视觉领域,点云数据是一种重要的三维数据类型,它能有效表达三维物体的形状信息。然而,由于点云数据的无序性和稀疏性,对其进行分析与处理的难度较大。本文将介绍如…...

大数据Flink(五十六):Standalone伪分布环境(开发测试)

文章目录 Standalone伪分布环境(开发测试) 一、架构图 二、环境准备 三、下载安装包</...

Godot 4 源码分析 - 碰撞

碰撞功能应该是一个核心功能&#xff0c;它能自动产生相应的数据&#xff0c;比如目标对象进入、离开本对象的检测区域。 基于属性设置&#xff0c;能碰撞的都具备这样的属性&#xff1a;Layer、Mask. 在Godot 4中&#xff0c;Collision属性中的Layer和Mask属性是用于定义碰撞…...

前端面试经典算法题

前言 现在面试流行考核算法&#xff0c;做过面试官&#xff0c;也被面试。问算法对面试官来说&#xff0c;是一种解脱&#xff0c;找出了一个看似很高明且能偷懒的办法选择人&#xff0c;避免了不知道问啥的尴尬&#xff1b;被面试者&#xff0c;也找到了一种新的面试八股文&am…...

5分钟掌握BepInEx:Unity游戏插件开发的终极框架指南

5分钟掌握BepInEx&#xff1a;Unity游戏插件开发的终极框架指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 如果你正在寻找一个强大、稳定且易于使用的Unity游戏插件开发框架&…...

实战演练:在快马平台模拟环境中验证智能车赛高级策略

作为一名参加过智能车竞赛的选手&#xff0c;我深知算法策略验证的重要性。以往我们需要反复在实车上调试&#xff0c;既耗时又容易损坏硬件。最近发现InsCode(快马)平台的模拟环境特别适合做赛前验证&#xff0c;今天就分享如何用它搭建完整的智能车策略测试系统。 赛道环境建…...

抖音直播回放下载工具全解析:技术原理与跨领域应用指南

抖音直播回放下载工具全解析&#xff1a;技术原理与跨领域应用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...

告别拼接URL!手把手教你封装HarmonyOS的POST请求工具类

告别拼接URL&#xff01;手把手教你封装HarmonyOS的POST请求工具类 在HarmonyOS应用开发中&#xff0c;网络请求是每个开发者都无法绕开的核心功能。很多从Android转战HarmonyOS的开发者会发现&#xff0c;原本在Android中通过Retrofit等框架轻松实现的POST请求&#xff0c;在H…...

用Minimalmodbus玩转PLC通信:从环境配置到寄存器读写的完整流程

MinimalModbus实战指南&#xff1a;高效连接西门子PLC的Python自动化方案 工业自动化领域的数据采集常面临设备资源有限、协议兼容性复杂等挑战。作为一款专为嵌入式系统优化的轻量级库&#xff0c;MinimalModbus以其简洁的API和极低的内存占用&#xff0c;成为连接西门子S7系列…...

Gemini助力Google Maps:开启智能出行新体验

Google Maps新成员Gemini&#xff1a;智能行程规划初体验 在Google Maps中&#xff0c;Gemini以“Ask Maps”的形式呈现&#xff0c;点击会弹出文本框。它能依据Google Maps的数据&#xff0c;结合用户评价来回答问题&#xff0c;还能从其他来源获取信息。测试中&#xff0c;让…...

从零构建:麦克纳姆轮底盘的运动学模型与O-长方形布局解析

1. 麦克纳姆轮基础原理与结构解析 第一次接触麦克纳姆轮时&#xff0c;我被它那酷似"风火轮"的外观吸引了。这种特殊设计的轮子由瑞典工程师Bengt Ilon在1973年发明&#xff0c;如今已成为移动机器人领域的明星组件。让我带你从最基础的物理结构开始&#xff0c;逐步…...

Guohua Diffusion国风绘画工具:5分钟快速部署,小白也能画水墨神兽

Guohua Diffusion国风绘画工具&#xff1a;5分钟快速部署&#xff0c;小白也能画水墨神兽 1. 工具简介&#xff1a;专为国风绘画而生的AI神器 Guohua Diffusion是一款专注于国风水墨画生成的本地AI绘画工具&#xff0c;基于原生Guohua-Diffusion模型开发。它最大的特点就是&q…...

5分钟本地部署Asian Beauty Z-Image Turbo:零基础生成东方美学人像写真

5分钟本地部署Asian Beauty Z-Image Turbo&#xff1a;零基础生成东方美学人像写真 在数字内容创作蓬勃发展的今天&#xff0c;高质量人像图像的需求与日俱增。特别是对于东方审美风格的人像写真&#xff0c;传统拍摄方式成本高昂且效率低下。今天&#xff0c;我将带你快速部署…...

CentOS7下CDP7.1.1集群部署全攻略:从系统调优到MySQL配置避坑指南

CentOS7企业级CDP7.1.1集群深度部署指南&#xff1a;系统调优与MySQL高可用实战 开篇&#xff1a;企业级大数据平台的基石构建 当数据量突破TB级门槛时&#xff0c;一个经过深度优化的集群环境直接决定了数据分析的效率和稳定性。我曾亲历过某金融客户由于透明大页未关闭导致集…...