聚焦:工厂模式是什么?工厂模式的详解
文章目录
前言传统模式简单工厂模式工厂方法模式抽象工厂模式
(资料图片仅供参考)
前言
Pizza orderPizza() {Pizza pizza = new Pizza();//准备材料pizza.prepare();//烘烤pizza.bake();//切pizza.cut();//装盒pizza.box();return pizza;}
传统模式
Pizza orderPizza(String type) {Pizza pizza;if(type.equals("chess"){pizza = new ChessPizza();}else if(type.equals("greek"){pizza = new GreekPizza();}else if(type.equals("apple"){pizza = new ApplePizza();}....//准备材料pizza.prepare();//烘烤pizza.bake();//切pizza.cut();//装盒pizza.box();return pizza;}
简单工厂模式
public class OrderPizza {public OrderPizza(SimpleFactory factory){setFactory(factory); } SimpleFactory factory = null; public void setFactory(SimpleFactory simpleFactory){String orderType = "";//用户输入的 this.factory = simpleFactory; do{orderType = getType(); Pizza pizza = factory.createPizza(orderType); if (pizza != null){pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); }else {System.out.println("订购Pizza失败!"); break; } }while (true); } //写一个方法 可以获取客户希望订购的pizza private String getType() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请在下面输入你要购买的Pizza"); String pizza = reader.readLine(); return pizza; } catch (IOException e) {e.printStackTrace(); return ""; } }}
public class SimpleFactory {public static Pizza createPizza(String pizzaType){Pizza pizza = null; System.out.println("使用了简单工厂模式"); if (pizzaType.equals("greek")) {pizza = new GreekPizza(); pizza.setName("greek"); } else if (pizzaType.equals("chess")) {pizza = new ChessPizza(); pizza.setName("chess"); } else if (pizzaType.equals("pepper")) {//新增PepperPizza的时候 修改了源代码 违反了ocp原则 如果新增10000个? //那就很麻烦了 pizza = new PepperPizza(); pizza.setName("pepper"); } return pizza; }}
工厂方法模式
AbstractFactory类
public abstract class AbstractFactory {//具体实现在子类,应用到了多态的特性 abstract Pizza createPizza(String orderType); public AbstractFactory(){String orderType = "";//用户输入的 Pizza pizza = null; do{orderType = getType(); //创建pizza延迟到子类 pizza = createPizza(orderType); if (pizza == null){break; } //输出制pizza的流程 pizza.prepare(); pizza.bake(); pizza.cut(); pizza.bake(); }while (true); } //写一个方法 可以获取客户希望订购的pizza private String getType() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请在下面输入你要购买的Pizza"); String pizza = reader.readLine(); return pizza; } catch (IOException e) {e.printStackTrace(); return ""; } }}
BJFactory
public class BJFactory extends AbstractFactory {@Override Pizza createPizza(String orderType) {Pizza pizza = null; if (orderType.equals("chess")){pizza = new BJChessPizza(); }else if (orderType.equals("pepper")){pizza = new BJPepperPizza(); } return pizza; }}
LDFactory
public class LDFactory extends AbstractFactory {@Override Pizza createPizza(String orderType) {Pizza pizza = null; if (orderType.equals("chess")){pizza = new LDChessPizza(); }else if (orderType.equals("pepper")){pizza = new LDPepperPizza(); } return pizza; }}
Pizza
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+"cutting;"); } //装盒打包 public void box(){System.out.println(name+"boxing"); } public String getName() {return name; } public void setName(String name) {this.name = name; }}
LDChessPizza
public class LDChessPizza extends Pizza {@Override public void prepare() {setName("伦敦奶酪披萨"); System.out.println("准备伦敦奶酪pizza的原材料....."); }}
BJPepperPizza
public class BJPepperPizza extends Pizza{@Override public void prepare() {setName("北京胡椒披萨"); System.out.println("准备北京胡椒pizza的原材料....."); }}
工厂方法模式定义
抽象工厂模式
AbstractFactory接口
public interface AbstractFactory {Pizza createPizza(String orderType); ··········· //创建酱的方法 ········ //创建蔬菜的方法 ········}
BJFactory类
public class BJFactory implements AbstractFactory {@Override public Pizza createPizza(String orderType) {System.out.println("~~~使用的是抽象工厂模式~~~"); Pizza pizza = null; if (orderType.equals("chess")){pizza = new BJChessPizza(); }else if (orderType.equals("pepper")){pizza = new BJPepperPizza(); } return pizza; } //实现其他佐料方法}
LDFactory类
public class LDFactory implements AbstractFactory {@Override public Pizza createPizza(String orderType) {System.out.println("~~~使用的是抽象工厂模式~~~"); Pizza pizza = null; if (orderType.equals("chess")){pizza = new LDChessPizza(); }else if (orderType.equals("pepper")){pizza = new LDPepperPizza(); } return pizza; } //实现其他佐料的方法}
OrderPizza类
public class OrderPizza {//抽象工厂 private AbstractFactory factory; public OrderPizza(AbstractFactory factory) {//通过构造器利用组合的方式 setFactory(factory); } //通过set利用组合的方法 public void setFactory(AbstractFactory factory) {this.factory = factory; do {String orderType = getType(); Pizza pizza = null; pizza = factory.createPizza(orderType); if (pizza == null) {System.out.println("订购失败!"); } else {pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } } while (true); } //写一个方法 可以获取客户希望订购的pizza private String getType() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请在下面输入你要购买的Pizza"); String pizza = reader.readLine(); return pizza; } catch (IOException e) {e.printStackTrace(); return ""; } }}
HeadFirst中,这段采访很精彩
简单工厂在jdk源码中的引用: 在调用createCalendar中,
private static Calendar createCalendar(TimeZone zone, Locale aLocale) {CalendarProvider provider = LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale) .getCalendarProvider(); if (provider != null) {try {return provider.getInstance(zone, aLocale); } catch (IllegalArgumentException iae) {// fall back to the default instantiation } } Calendar cal = null; if (aLocale.hasExtensions()) {String caltype = aLocale.getUnicodeLocaleType("ca"); if (caltype != null) {switch (caltype) {case "buddhist": cal = new BuddhistCalendar(zone, aLocale); break; case "japanese": cal = new JapaneseImperialCalendar(zone, aLocale); break; case "gregory": cal = new GregorianCalendar(zone, aLocale); break; } } } if (cal == null) {// If no known calendar type is explicitly specified, // perform the traditional way to create a Calendar: // create a BuddhistCalendar for th_TH locale, // a JapaneseImperialCalendar for ja_JP_JP locale, or // a GregorianCalendar for any other locales. // NOTE: The language, country and variant strings are interned. if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {cal = new BuddhistCalendar(zone, aLocale); } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja" && aLocale.getCountry() == "JP") {cal = new JapaneseImperialCalendar(zone, aLocale); } else {cal = new GregorianCalendar(zone, aLocale); } } return cal; }
标签:
相关推荐:
最新新闻:
- 全球百事通!格式化时间是什么?抽象类DateFormat是什么?
- 格式化时间是什么?抽象类DateFormat是什么?:当前热文
- 迅雷怎么高速下载?迅雷高速下载方法
- 打印机共享需要密码怎么办?打印机共享需要密码解决方法
- 如何解决手机浏览器中出现404notfound的问题?手机浏览器404notfound解决方法
- 电脑无法进入系统怎么办?电脑无法进入系统解决方法
- 电脑的显示器屏幕老是闪烁怎么办?电脑的显示器屏幕老是闪烁解决方法
- 如何联系爱奇艺APP中的人工客服?爱奇艺APP人工客服联系步骤
- 宽带的内网和外网什么意思?宽带的内网和外网介绍
- USB2.0怎样提高传输速度?提高传输速度方法
- 摄像头远程监控步骤是什么?手机远程监控摄像头设置方法
- 多普达有哪些型号的手机?多普达最新手机大全详情 天天新视野
- U盘遇到病毒怎么办?U盘遇到病毒解决方法
- 快讯:文章目录是什么?选择排序怎么设置?
- 信号的基本概念是什么?信号的分类有哪些?
- Excel函数之VLOOKUP()怎么使用?一文搞懂Excel函数之VLOOKUP()使用
- 倒车雷达哪个品牌好?汽车倒车雷达品牌及价格介绍_每日信息
- 美国多灵门锁怎么安装?美国多灵门锁安装步骤?
- 网络的利与弊是什么?网络的利弊分析:环球消息
- lol怎么在游戏里回复好友?lol游戏回复消息设置-环球视点
- OneNote是什么?OneNote的功能有哪些?
- 每日简讯:磁条读写器多少钱?磁条读写器怎么使用?
- 三星N8010如何设置?三星N8010的屏幕锁定图案_快消息
- 世界热文:c语言餐桌游戏有哪些?教会你这十款酒桌游戏让你在朋友圈稳站“C”位!
- 电脑默认网关如何查询?电脑默认网关查询的小技巧
- iPad Air(iPad5)什么时候上市?iPad Air(iPad5)的上市时间-今日快看
- IE浏览器不见了怎么办?IE浏览器不见了解决方法
- Win7专业版与Win7旗舰版如何区分?Win7专业版与Win7旗舰版区分方法
- 聚焦:工厂模式是什么?工厂模式的详解
- Win7系统安装声卡驱动失败怎么办?声卡驱动安装失败解决方法
- mysql置疑原因是什么?数据库置疑的处理办法
- 百度快照如何彻底删除?百度快照正确的删除方法
- 禁用宏则关闭excel文件怎么弄?设置流程_天天速递
- 英雄联盟无法全屏显示如何解决?英雄联盟无法全屏显示解决方法
- 焦点热讯:支付宝阿里巴巴货到付款如何交易?货到付款交易流程
- 如何解决IE浏览器网页图片显示红叉问题?IE浏览器网页图片显示红叉解决方法
- 今日看点:手机QQ接收电脑端好友发送的文件存储在什么地方?文件储存的详细路径
- 语义分割:基于openCV和深度学习(二)_环球速看料
- 微特微电机怎么样?微特微电机详情介绍:热闻
- Win7系统安装CAD软件提示缺少dfst.dll怎么办?解决方法
- 电脑电源额定功率要多少才合适?电脑电源的额定功率|前沿热点
- 【世界快播报】CSS:好玩的‘伪类’系列之——(:only-child与:only-of-type) 例子说明
- 内网端口映射怎么设置?内网端口映射定义及设置方法
- 当前热议!如何正确使用系统清理bat程序?清理bat程序的方法
- 美拍是什么?美拍怎么用?
- 用身份证办的移动手机号码可以跨省改归属地吗?不能
- Photoshop中图层混合模式是什么?Photoshop中图层混合模式包括哪些?
- 怎么关闭微信的扫脸支付功能?微信的扫脸支付功能关闭步骤
- 世界顶级昂贵音响有哪些?世界顶级昂贵音响详细介绍
- 天天热点!专升本英语重要知识点补充 英语全部知识点详情介绍
- 英雄联盟无法全屏显示如何解决?英雄联盟无法全屏显示解决方法
- 如何解决IE浏览器网页图片显示红叉问题?IE浏览器网页图片显示红叉解决方法
- Win7系统安装CAD软件提示缺少dfst.dll怎么办?解决方法
- 内网端口映射怎么设置?内网端口映射定义及设置方法
- 美拍是什么?美拍怎么用?
- 怎么关闭微信的扫脸支付功能?微信的扫脸支付功能关闭步骤
- 朴叙俊将加盟《惊奇队长2》 演惊奇队长丈夫|当前头条
- PSVR2首发获两款老游戏强化!可4K、90帧运行
- 许多推倒重建正在发生 | 独家对话索尼互娱中国总裁
- 二代接班,一场父与子的「明争暗战」 全球新动态
- 《高达 水星魔女》一阶段最终话暂停 明年1月8日续播
- 传英伟达RTX 4070Ti首发价899美元 约合RMB 6268元|环球资讯
- 天天速看:CDP警告员工《巫师》AR手游停服后将会进行裁员
- 【新要闻】育碧:《纪元1800》于今日返回Steam平台
- 关注:《铁拳8》TGA预热视频 2023年发售
- 世界观点:看不起英特尔独显?一个驱动更新游戏帧数提升80%
- 游戏玩家抓紧更新!Win 11修复重大性能BUG 帧率显著提升
- 泛娱乐出海拉美,茄子科技(海外SHAREit Group)助力企业有效获客
- 在云南沙溪,这群年轻人每天做的事是「什么也不做」 每日视讯
- 【环球时快讯】一起教育科技发布2022年三季度财报:连续四个季度实现盈利
- 2部国产动画获奥斯卡参评资格:豆瓣分别7.0分、5.8分 今日关注
- 《暗黑4》新预告片将在明早1点公开_每日聚焦
- 全球视讯!《微软飞行模拟》玩家达到了1000万
- Windows 11免费升级新招 Windows 7也能用:全球今头条
- 把iMac按在地上摩擦 4K屏+RTX 3060独显微软Surface一体电脑预售中|重点聚焦