设计模式(二)——Java简单工厂模式
简单工厂模式
案例:
披萨的项目(要便于披萨种类的扩展,要便于维护)
1)披萨的种类很多(比如 GreekPizz、CheesePizz 等)
2)披萨的制作有 prepare,bake, cut, box
3)完成披萨店订购功能。
使用传统的方式来完成

编写 OrderPizza.java 去订购需要的各种 Pizza
Pizza类
package com.lin.simplefactory;
public class SimpleFactoryDemo {
}
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 ChessPizza extends Pizza{
}
// greekpizza
class GreekPizza extends Pizza{
}
// chinapizza
class ChinaPizza extends Pizza{
}
OrderPizza类
package com.lin.simplefactory; import java.util.Scanner;
/**
* 假如有很多orderpizza,如果增加一种pizza种类,修改就很麻烦,效率低
* @Description:
* @author LinZM
* @date 2021-2-3 0:29:26
* @version V1.8
*/
public class OrderPizza { public OrderPizza(){
Pizza pizza = null;
String orderType;
while(true) {
orderType = getType();
if(orderType.equals("chess")) {
pizza = new ChessPizza();
pizza.setName("chesspizza");
} else if(orderType.equals("greek")) {
pizza = new ChessPizza();
pizza.setName("greekpizza");
} else if(orderType.equals("china")) {
pizza = new ChessPizza();
pizza.setName("chinapizza");
} else {
break;
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}
}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;
}
}
PizzaStore类
package com.lin.simplefactory;
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza();
}
}
传统的方式的优缺点

1)优点是比较好理解,简单易操作。
2)缺点是违反了设计模式的 ocp 原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.
3)比如我们这时要新增加一个 Pizza 的种类(Pepper 披萨),我们需要做如下修改. 如果我们增加一个 Pizza 类,只要是订购 Pizza 的代码都需要修改.
改进的思路分析
分析:修改代码可以接受,但是如果我们在其它的地方也有创建 Pizza 的代码,就意味着,也需要修改,而创建 Pizza
的代码,往往有多处。
思路:把创建 Pizza 对象封装到一个类中,这样我们有新的 Pizza 种类时,只需要修改该类就可,其它有创建到 Pizza
对象的代码就不需要修改了.-> 简单工厂模式
基本介绍
1) 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。
2) 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。
3) 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。
使用简单工厂模式
简单工厂模式的设计方案: 定义一个可以实例化 Pizaa 对象的类,封装创建对象的代码。

Pizza类不变
OrderPizza类
package com.lin.simplefactory; import java.util.Scanner;
/**
* 假如有很多orderpizza,如果增加一种pizza种类,修改就很麻烦,效率低
* @Description:
* @author LinZM
* @date 2021-2-3 0:29:26
* @version V1.8
*/
public class OrderPizza { //定义一个工厂对象
public SimpleFactory factory = null;
public Pizza pizza = null; // 构造器
public OrderPizza(SimpleFactory factory) {
setFactory(factory);
}
public void setFactory(SimpleFactory factory) {
String type = "";
this.factory = factory;
while(true) {
type = getType();
pizza = this.factory.createPizza(type); if(pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("没有这种披萨!");
break;
}
}
} 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;
}
}
增加一个类--SimpleFatcory类
package com.lin.simplefactory;
/**
* 简单工厂模式
* @Description:
* @author LinZM
* @date 2021-2-3 0:28:04
* @version V1.8
*/
public class SimpleFactory { public Pizza createPizza(String orderType) {
Pizza pizza = null; System.out.println("使用简单工厂模式");
if(orderType.equals("chess")) {
pizza = new ChessPizza();
pizza.setName("chesspizza");
} else if(orderType.equals("greek")) {
pizza = new ChessPizza();
pizza.setName("greekpizza");
} else if(orderType.equals("china")) {
pizza = new ChessPizza();
pizza.setName("chinapizza");
}
return pizza;
}
}
PizzaStore类
package com.lin.simplefactory;
public class PizzaStore {
public static void main(String[] args) {
// new OrderPizza();
new OrderPizza(new SimpleFactory());
}
}
同时,简单工厂模式又叫静态工厂模式,在OrderPizza类中将creatPizza改为static,在后面使用类.方法名方式调用该方法。
仅供参考,有错误还请指出!
有什么想法,评论区留言,互相指教指教。
设计模式(二)——Java简单工厂模式的更多相关文章
- 设计模式(二)简单工厂模式(Simple Factory Pattern)
一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...
- Java描述设计模式(02):简单工厂模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根 ...
- java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
- Unity C# 设计模式(二)简单工厂模式
定义: 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 ...
- !!转!!java 简单工厂模式
举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...
- Java简单工厂模式
Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...
- Java 设计模式系列(二)简单工厂模式和工厂方法模式
Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...
- Java设计模式2:简单工厂模式
简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
随机推荐
- 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录
风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...
- WEB安全讨论-表单登录是先验证验证码还是密码
表单登录是先验证验证码还是密码? 肯定是验证码呀!!!这是毋庸置疑的.但是发现有人会验证密码,感觉先验证密码和先验证验证码是一个概念是一样的.但是其实是完全不一样的.下面我们来一起详细的剖析一下: 消 ...
- LeetCode237 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...
- 来不及解释!Linux常用命令大全,先收藏再说
摘要:Linux常用命令,很适合你的. 一提到操作系统,我们首先想到的就是windows和Linux.Windows以直观的可视化的方式操作,特别适合在桌面端PC上操作执行相应的软件.相比较Windo ...
- 深入理解static、volatile关键字
static 意思是静态的,全局的.被修饰的东西在一定范围内是共享的,被类的所有实例共享,这时候需要注意并发读写的问题. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们. ...
- Spring Initializr中生成的mvnw是干吗的?
当我们使用Spring Initializr来创建Spring Boot工程的时候,有没有发现在工程根目录下有两个名为mvnw的文件: 从命名.图标.扩展名来猜测,这两个文件的作用应该是一样的,只是c ...
- Java 栈的使用
讲栈之前,要先讲一下Deque双端队列 既可以添加到队尾,也可以添加到队首 既可以从队首获取又可以从队尾获取 public interface Deque<E> extends Queue ...
- Python执行程序实可视化_heartrate
最近发现了一个Python程序执行的简单实时可视化神器,名字叫 heartrate,安装完运行可以看到下面这样的炫酷过程. 虽然很炫酷,但有点看不懂. 来解释下,左边的动态数字代表每行被触发的次数.变 ...
- CNN可视化技术总结(一)--特征图可视化
导言: 在CV很多方向所谓改进模型,改进网络,都是在按照人的主观思想在改进,常常在说CNN的本质是提取特征,但并不知道它提取了什么特征,哪些区域对于识别真正起作用,也不知道网络是根据什么得出了分类结果 ...
- ROS教程(一):ROS安装教程(详细图文)
ros教程:ros安装 目录 前言 一.版本选择 二.开始安装 2.1 软件中心配置 2.2 添加源 2.3 安装 三.验证ROS 前言 关于ROS(Robot OS 机器人操作系统),估计看这个教程 ...