设计模式(二)——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设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
随机推荐
- linux系统修改不成功无法修改密码
一.问题描述 新上架的浪潮服务器使用装机平台进行统一安装,安装完成后修改用户密码时统一无法修改,使用root账户无法修改其他用户密码,自身根密码也无法修改成功,报错如下 Changing passwo ...
- MySQL/MariaDB二进制安装
本文说明MySQL/MariaDB二进制安装的过程 mysql和mariadb的安装方式基本一致,唯一初始化方式有点不一样 1.规划: 数据文件存储位置 /data/my ...
- Go 的定时任务模块 Cron 使用
前言 新项目是Golang作为开发语言, 遇到了些新的坑, 也学到了新的知识, 收获颇丰 本章介绍在Go中使用Cron定时任务模块来实现逻辑 正文 在项目中, 我们往往需要定时执行一些逻辑, 举个例子 ...
- Docker学习笔记之搭建Docker私有仓库
Docker仓库服务器名为Docker注册(registry)服务器.可以使用docker push命令将镜像上传到注册服务器,也可以使用docker pull命令下载服务器的镜像. Docker注册 ...
- 【Problems】MySQL5.7 datetime 默认值设为‘0000-00-00 00:00:00'值出错
记录 MySQL5.7 datetime 默认值设为'0000-00-00 00:00:00'值出错 我的MySQL版本 mysql --version 5.7.28 C:\Users\x1c> ...
- alter column和modify column
5.6中,发现其实alter column 和更改modify column 步骤是一样的 mysql> create table xs(name varchar(12),age int def ...
- Java并发/多线程-CAS原理分析
目录 什么是CAS 并发安全问题 举一个典型的例子i++ 如何解决? 底层原理 CAS需要注意的问题 使用限制 ABA 问题 概念 解决方案 高竞争下的开销问题 什么是CAS CAS 即 compar ...
- cmd的终结工具cmder
常用快捷键 win+alt+t 打开任务设置窗口 win+alt+k 打开快捷键设置窗口 自定义屏幕分割窗口快捷键: ctl+shift+s 水平按50%比例分割 ctl+shift+v 垂直按50 ...
- oracle RAC和RACOneNode之间的转换
Convert RAC TO RACOneNode 1.查看资源状态 [grid@rac01 ~]$ crsctl status res -t 从这里看到,数据库的名字叫racdb 2.查看实例 [o ...
- Dubbo中的统一契约是如何实现的?
写在前面 之前,很多小伙伴私信我:如何才能快速的掌握Dubbo的核心原理和源码.所以,我写了一篇<我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?>.对于Dubbo的源码解析系 ...