设计模式(三)——Java工厂方法模式
工厂方法模式
1 看一个新的需求
披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza。
2 思路 1
使用简单工厂模式,创建不同的简单工厂类,比如 BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等.从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好
3 思路 2
使用工厂方法模式
4 工厂方法模式介绍
1) 工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
2) 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
5 工厂方法模式应用案例
1) 披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza、北京的胡椒 pizza 或者是伦敦的奶酪 pizza、伦敦的胡椒 pizza
2) 思路分析图解
Pizza类
package com.lin.factorymethod; abstract class Pizza{ private String name; public void setName(String name) {
this.name = name;
} public void prepare() {
System.out.println(name + " are prepared!");
} public void bake() {
System.out.println(name + " are baked!");
} public void cut() {
System.out.println(name + " are cutted!");
} public void box() {
System.out.println(name + " are boxed!");
} } // 北京chesspizza
class BJChessPizza extends Pizza{ } // 北京greekpizza
class BJGreekPizza extends Pizza{ } //伦敦chesspizza
class LNChessPizza extends Pizza{ } //伦敦greekpizza
class LNGreekPizza extends Pizza{ }
OrderPizza
package com.lin.factorymethod; import java.util.Scanner; public abstract class OrderPizza { public OrderPizza(){
Pizza pizza = null;
String orderType;
while(true) {
orderType = getType();
pizza = createPizza(orderType);
if( pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("没有这种类型!");
} }
} // 定义一个抽象方法,createPizza,让各个工厂子类去实现
public abstract Pizza createPizza(String orderType); public String getType() {
Scanner str = new Scanner(System.in);
System.out.println("please input the type of ordered pizza:");
String type = str.next();
return type;
}
} class BJOrderPizza extends OrderPizza { @Override
public Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")) {
pizza = new BJChessPizza();
pizza.setName("北京Cheese");
} else if(orderType.equals("greek")) {
pizza = new BJGreekPizza();
pizza.setName("北京Greek");
}
return pizza;
} } class LNOrderPizza extends OrderPizza { @Override
public Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")) {
pizza = new LNChessPizza();
pizza.setName("伦敦Cheese");
} else if(orderType.equals("greek")) {
pizza = new LNGreekPizza();
pizza.setName("伦敦Greek");
}
return pizza;
} }
PizzaStore类
package com.lin.factorymethod; import java.util.Scanner; public class PizzaStore { public static void main(String[] args) {
System.out.println("请输入地名:");
Scanner scanner = new Scanner(System.in);
String place = ""; place = scanner.next();
if(place.equals("伦敦")) {
new LNOrderPizza();
} else if(place.equals("北京")) {
new BJOrderPizza();
} else {
System.out.println("该地域暂时没有开通功能!");
}
} }
仅供参考,有错误还请指出!
有什么想法,评论区留言,互相指教指教。
设计模式(三)——Java工厂方法模式的更多相关文章
- 设计模式(三)工厂方法模式(Factory Pattern)
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- 【C#设计模式3】工厂方法模式
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- 重学 Java 设计模式:实战工厂方法模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- java设计模式-----2、工厂方法模式
再看工厂方法模式之前先看看简单工厂模式 工厂方法模式(FACTORY METHOD)同样属于一种常用的对象创建型设计模式,又称为多态工厂模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的 ...
- Java描述设计模式(03):工厂方法模式
本文源码:GitHub·点这里 || GitEE·点这里 一.工厂方法模式 1.生活场景 系统常见的数据导出功能:数据导出PDF.WORD等常见格式. 2.工厂方法模式 是类的创建模式,又叫做虚拟构造 ...
- Java设计模式3:工厂方法模式
工厂方法模式 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中. 工厂方法模式 工厂方法模式是对简单工厂模式进一步抽象的结果. 假如是不使用反 ...
- 《JAVA设计模式》之工厂方法模式 (Factory)
在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...
- Unity C# 设计模式(三)工厂方法模式
定义: 定义一个创建对象的接口(父类),由子类决定需要实例化哪一个类. 这样,核心工厂类成为了一个抽象角色,不再负责产品的创建,仅提供具体工厂类所必须实现的接口,这样进一步抽象化的好处是使得工厂方法模 ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...
随机推荐
- spark的运行指标监控
sparkUi的4040界面已经有了运行监控指标,为什么我们还要自定义存入redis? 1.结合自己的业务,可以将监控页面集成到自己的数据平台内,方便问题查找,邮件告警 2.可以在sparkUi的基础 ...
- AI算法测评事项
前言 注:大概2017年-2018年国内人工智能热度达到顶峰,随后热度开始逐渐减少.2018年前人工智能被投资界.学术界.工业界和媒体炒的特别热,各大企业都想尝试一下深度学习技术在业务场景的应用.试水 ...
- 解决 unknown filesystem type ntfs U盘/移动硬盘挂载出错问题
大内存U盘或者移动硬盘挂在再Linux 时,报错unknown filesystem type ntfs 1.安装ntfs-3g wget http://tuxera.com/opensource/n ...
- Java基础进阶类名整理
类名综合 数学类: Math:数学运算 BigDecimal:用于精确计算数据 数组工具类: Arrays:数组工具类,用于对数组的操作 时间操作: JDK8以前: Date:表示一个时间,并面向对象 ...
- 【Linux】1、命令行及命令参数
命令行及命令参数 文章目录 命令行及命令参数 1.命令行提示符 2.命令和命令参数 简单的命令 date ls 命令参数 短参数(一个字母) 长参数(多个字母) 参数的值 其它参数 3.小结 4.参考 ...
- kubernets之statefulset资源
一 了解Statefulset 1.1 对比statefulset与RS以及RC的区别以及相同点 Statefulset是有状态的,而RC以及RS等是没有状态的 Statefulset是有序的,拥 ...
- ctfhub技能树—信息泄露—备份文件下载—网站源码
打开靶机 查看网页内容 使用dirsearch进行扫描 命令如下 python3 dirsearch.py -u http://challenge-91f1f5e6a791ab02.sandbox.c ...
- Spring Boot 2.x基础教程:配置元数据的应用
在使用Spring Boot开发应用的时候,你是否有发现这样的情况:自定义属性是有高量背景的,鼠标放上去,有一个Cannot resolve configuration property的配置警告. ...
- oracle 释放表空间到OS(resize)
1.查看表空间里面的对象 SELECT OWNER AS OWNER, SEGMENT_NAME AS SEGMENT_NAME, SEGMENT_TYPE AS SEGMENT_TYPE, SUM ...
- VPS下环境漏洞部署
No.1 声明 1.由于本环节运行在公网,如何同样复现情况,复现成功后请立即关闭环境! 2.本环境仅用于漏洞复现! No.2 安装docker curl -s https://get.docker.c ...