2.简单工厂模式

        简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一 个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族 中最简单实用的模式
        简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行 (代码)
        在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。 

来看一个订购面包的实例,要求程序具有可扩展性

1)面包的种类很多,(ButterBread, Toast...)

2)制作过程,(prepare, bake, pack)

3)完成面包的订购功能

2.1  传统的方法

思路:

需要用到的类,Bread抽象类,ButterBread,Toast具体的实现类,OrderBread面包的订购类

具体实现,在OrderBread中完成对不同种类面包的订购

UML类图

代码

//Bread.java
public abstract class Bread {protected String type;//用于给设置type的值public void setType(String type) {this.type = type;}//准备面包材料public void prepare() {System.out.println("正在准备" + type + "面包的材料");}//烘焙面包public void bake() {System.out.println(type + "正在烘焙中");}//打包面包public void pack() {System.out.println(type + "正在打包中");}
}class Toast extends Bread {
}class ButterBread extends Bread {
}//OrderBread.java
public class OrderBread {public void orderBread() {while(true) {String type = getType();Bread bread;if ("Toast".equalsIgnoreCase(type)) {bread = new ButterBread();bread.setType("Toast");} else if ("ButterBread".equalsIgnoreCase(type)) {bread = new Toast();bread.setType("ButterBread");} else {break;}//输出面包的订购过程if (bread != null) {bread.prepare();bread.bake();bread.pack();System.out.println("----------------------------");}}}//可以获取客户希望订购的面包种类,就是从控制台上获取输入数据private String getType() {try {BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));System.out.println("input Bread 种类:");String str = strin.readLine();return str;} catch (IOException e) {e.printStackTrace();return "";}}
}//main测试代码
public static void main(String[] args) {OrderBread orderBread = new OrderBread();orderBread.orderBread();
}

测试结果

input pizza 种类:
toast
正在准备Toast面包的材料
Toast正在烘焙中
Toast正在打包中
----------------------------
input pizza 种类:
butterbread
正在准备ButterBread面包的材料
ButterBread正在烘焙中
ButterBread正在打包中
----------------------------
input pizza 种类:

存在问题

1.让我们看看如果增加一种面包(WholeWheatBread)会发生什么

可以看到图中两条红线的情况,主要的改动是添加了一个类,OrderBread中需要修改if分支的代码

2.上一种情况看似问题不是很大,指修改了两个部分,那么如果我们的店铺扩张,又要添加新的订购类呢?就会变成如下情况

而这时如果我们在添加一种面包,需要同时改动OrderBread1与OrderBread2,需要改动的地方直接翻倍。

可以看到,这种方式随着类的增多,是十分不利于扩展和维护的。类越多,增加扩展所需要的改动就越多,稍有不慎就有可能遗漏,发生错误。

2.2  简单工厂模式

思路:

新增一个SimpleFactory类,将面包的订购过程转移到该类的内部,让其他的Order类依赖SimpleFactory类,使得各种Order类与面包之间不存在依赖关系。另各种Order类转而依赖SimpleFactory类。

UML类图

代码(只包括修改或者新增的类)

//OrderBread.java
public class OrderBread {private SimpleFactory simpleFactory = new SimpleFactory();public void orderBread() {while (true) {Bread bread = simpleFactory.createBread(getType());//输出面包的订购过程if (bread != null) {bread.prepare();bread.bake();bread.pack();System.out.println("----------------------------");} else {System.out.println("订购失败");break;}}}//可以获取客户希望订购的面包种类,就是从控制台上获取输入数据private String getType() {try {BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));System.out.println("input Bread 种类:");String str = strin.readLine();return str;} catch (IOException e) {e.printStackTrace();return "";}}
}//新建立的SimpleFactory类
public class SimpleFactory {//将Order类中创建面包的过程移动到此处public Bread createBread(String type) {Bread bread = null;if ("Toast".equalsIgnoreCase(type)) {bread = new ButterBread();bread.setType("Toast");} else if ("ButterBread".equalsIgnoreCase(type)) {bread = new Toast();bread.setType("ButterBread");}return bread;}
}

扩展需求

当我们要尝试着添加一个新的Order与面包种类时,只需要在SimpleFactory中新增面包的种类,而不用将每个Order类全部修改。

2.3两种方法的对比

传统方法:简单易懂,但是不利于扩展与维护。

简单工厂模式:将创建类的过程交给工厂类来完成,便于扩展新功能。

设计模式笔记2-简单工厂模式(带有自制UML类图)相关推荐

  1. 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式

    文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...

  2. 手撕设计模式之「简单工厂模式」(Java描述)

    前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...

  3. 23种设计模式 -----Day01:简单工厂模式

    目录 前言 1.设计模式(Design pattern)定义 2.为什么要使用设计模式(使用设计模式的意义) 3.设计原则 a.单一职责原则 b.开放封闭原则 c.里氏代换原则 d.迪米特法则 e.依 ...

  4. 大话设计模式Python实现-简单工厂模式

    简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 下面使用简单工厂模式实现一个简单的四则运算 1 #!/us ...

  5. 设计模式----2(简单工厂模式的概念,简单工厂模式的实现,简单工厂模式的优缺点)

    简单工厂模式 简单工厂模式的概念 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负 责创建其他类的实例,被创建的实例通常都具有共同的父类. 具体分类 工厂(Creator ...

  6. 设计模式(1):简单工厂模式(Simple Factory Pattern)

    1. 从一个简单的例子开始 在众多的设计原则中,有一条原则是这么说的:要针对接口编程,不要针对实现编程. 针对接口编程的话,可以使用不同的实现类来创建这个对象.比如需要一个List: List< ...

  7. Java描述设计模式(02):简单工厂模式

    一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根据食品名称,加工指定类型食品 4).模拟客户端预定操作 2 ...

  8. 设计模式学习-简单工厂模式

    模式概述: 专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属 ...

  9. 从王者荣耀看设计模式(四.简单工厂模式)

    从王者荣耀看设计模式(简单工厂模式) 一.简介 游戏开始前,玩家可从英雄池自由挑选将要出战的英雄 二.简单工厂模式 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫 ...

  10. 设计模式第一篇——简单工厂模式&类图

    从今天开始,小菜决定记录下来自己学习设计模式的过程,并总结每天所学内容记录在博客中. 以编写计算器程序为例,有+,-,*,/--很多种运算,因此需要if,else或switch,case进行判断,当有 ...

最新文章

  1. c语言中 char怎样用,C语言中char*和char[]用法区别分析
  2. JRebel for IntelliJ 热部署方法
  3. 计算机外观类型,知道你的笔记本电脑是什么类型的吗?五大类型派对号入座
  4. BugkuCTF-Misc:宽带信息泄露
  5. .NET开发者必备的工具箱
  6. java重定向代码_Java程序员经典面试题集大全 (三十四)
  7. 单片机如何用普通电池供电?
  8. Mr.J--Java接口实现
  9. Specified key was too long; max key length is 767 bytes
  10. 使用go制作微服务数据计算
  11. 爬取微博的数据时别人用的是FM.view方法传递html标签那么jsoup怎么解析呢
  12. Atitit 数据库映射到redis存储的模式 1. 常规 每条db记录映射一个redis记录 1 1.1. 表名:主键为key ,记录序列化为json为val 1 2. 每个字段映射一个redi
  13. Matlab2010b反复激活解决办法
  14. 程序员如何做好自己的职业规划
  15. 三星手机S8曝光 新机发布或推迟
  16. python安卓模拟器图像识别_Android模拟器识别检测技术
  17. JS遍历对象,获取key、value的几种方法
  18. LabVIEW学习分享(2)
  19. ajax post 提交大量数据
  20. python requests的作用_requests session的作用

热门文章

  1. BP神经网络模型介绍
  2. Python爬虫入门:初识爬虫
  3. 标准的Java编码规范手册
  4. 国标28181: 视频国标28181协议
  5. AMESim 14.0 win10环境下安装教程
  6. Fireworks免费下载
  7. 2021-08-18我的第一篇博客——STM32单片机的开发环境Keil5(MDK)的安装与破解
  8. sql盲注 解决_SQL盲注攻击的简单介绍
  9. CAD关于线型操作添加线型(com接口c#语言)
  10. CentOS hping3安装