《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 📕 学习格言:博观而约取࿰…...
帕累托森林: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 源码分析 - 碰撞
碰撞功能应该是一个核心功能,它能自动产生相应的数据,比如目标对象进入、离开本对象的检测区域。 基于属性设置,能碰撞的都具备这样的属性:Layer、Mask. 在Godot 4中,Collision属性中的Layer和Mask属性是用于定义碰撞…...
前端面试经典算法题
前言 现在面试流行考核算法,做过面试官,也被面试。问算法对面试官来说,是一种解脱,找出了一个看似很高明且能偷懒的办法选择人,避免了不知道问啥的尴尬;被面试者,也找到了一种新的面试八股文&am…...
35岁程序员收藏!转行大模型,抢占高薪风口,从入门到高薪 Offer 全攻略
35岁程序员收藏!转行大模型,抢占高薪风口,从入门到高薪 Offer 全攻略 35岁程序员面临职业瓶颈,大模型技术提供了转行出路。文章分析了为何转行大模型是明智之选,包括行业风口、需求缺口大、原有技术可复用、职业生命周…...
模拟开关原理与应用全解析
1. 模拟开关的本质与应用场景模拟开关这个器件,在电路设计中扮演着"交通警察"的角色。想象一下城市道路上的红绿灯——它不会改变车辆本身,只是控制着车流的通断和方向。模拟开关的工作原理与之类似,它专门用于控制模拟信号的路径选…...
Three.js实战:打造交互式3D中国地图可视化
1. 从零开始搭建3D中国地图 第一次接触Three.js时,我被它强大的3D渲染能力震撼到了。作为一个长期从事数据可视化的开发者,我一直在寻找能够将地理数据以更生动方式呈现的工具。Three.js配合D3.js的组合,完美解决了这个问题。 1.1 数据准备与…...
Speechless:为你的微博记忆穿上PDF保护衣
Speechless:为你的微博记忆穿上PDF保护衣 【免费下载链接】Speechless 把新浪微博的内容,导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 在数字记忆碎片化的时代,你是否曾担…...
10:2026 AI变现实战总览:内容、工具、信息差三种变现闭环
作者: HOS(安全风信子) 日期: 2026-04-01 主要来源平台: GitHub 摘要: 提前剧透12大模块如何串联成3条可复制的赚钱路径。本文构建内容变现2.0闭环全图(Agentic生成)、工具/SaaS变现闭环全图(Ag…...
nba篮球数据项目书
import pandas as pd import randomdef get_2000_nba_players():"""生成2000条NBA球员数据(基于真实球员名 合理数据)100%成功,无需网络请求"""# 真实NBA球员名(前200名真实球员)real_…...
【无标题】一次简笔
我是一名大一的学生,我未来想要从事计算机方面的工作。我充满理想有自信,相信我可以找到一份3w的工作,我想要到腾讯当技术岗位,我愿意花费精力和时间在这方面学习编程。我会每周拿出六天时间来潜心学习。“what doesnt kill me ma…...
提升前端效率:用快马实践vibe coding快速生成沉浸式番茄钟应用
最近在尝试提升前端开发效率时,发现了一种很有意思的开发方式——vibe coding。简单来说,就是通过描述想要的界面氛围和交互感觉,快速生成对应的功能代码。这种方式特别适合需要快速验证想法或者搭建基础框架的场景。 今天就用InsCode(快马)…...
SClick进阶技巧:6个提升使用体验的实用功能
SClick是一款轻量级的防休眠工具,能够帮助用户解决Windows系统自动休眠带来的诸多不便。 软件体积仅有几十KB,绿色便携,无需安装,即用即走。 它通过模拟鼠标点击的方式,让系统以为用户一直在操作电脑,从而防…...
收藏备用!小白程序员必看,大模型核心原理拆解(通俗易懂版)
本文专为CSDN小白程序员、AI入门者打造,用“技术拆解通俗类比”的方式,深入解析大模型的核心原理,避开专业术语壁垒。明确大模型的AI分支定位,拆解其三大底层逻辑,补充微调、提示工程的实操要点,澄清新手常…...
