一 需求

看一个披萨的项目:要便于披萨种类的扩展,要便于维护

  1. 披萨的种类很多(比如 GreekPizz、CheesePizz 等)
  2. 披萨的制作有 prepare,bake, cut, box
  3. 完成披萨店订购功能。

二 使用传统的方式来完成

2.1 思路分析(类图)

2.2代码

  1. Pizza类
package com.yqq.pattern.factory.simple.pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/18/20:15* @Description:*/
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 void setName(String name) {this.name = name;}
}
  1. CheesePizza类
package com.yqq.pattern.factory.simple.pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/18/21:30* @Description:*/
public class CheesePizza extends Pizza{public void prepare() {System.out.println("给制作奶酪披萨准备原材料");}
}
  1. GreekPizza类
package com.yqq.pattern.factory.simple.pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/18/21:31* @Description:*/
public class GreekPizza extends Pizza{public void prepare() {System.out.println("给希腊披萨准备原材料");}
}
  1. PepperPizza类
package com.yqq.pattern.factory.simple.pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/18/23:03* @Description:*/
public class PepperPizza extends Pizza{public void prepare() {System.out.println("给胡椒披萨准备原材料");}
}
  1. OrderPizza类(使用方)
package com.yqq.pattern.factory.simple.order;import com.yqq.pattern.factory.simple.pizza.GreekPizza;
import com.yqq.pattern.factory.simple.pizza.PepperPizza;
import com.yqq.pattern.factory.simple.pizza.Pizza;import java.io.BufferedReader;
import java.io.InputStreamReader;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/18/22:08* @Description: 使用方*/
public class OrderPizza {//构造器public OrderPizza(){Pizza pizza = null;String orderType;//订购披萨的类型do {orderType = getType();if (orderType.equals("greek")){pizza = new GreekPizza();pizza.setName("希腊披萨");}else if (orderType.equals("cheese")){pizza = new GreekPizza();pizza.setName("奶酪披萨");}//这里属于新增一个披萨类型后要修改使用方代码,违反了开闭原则else if (orderType.equals("pepper")){pizza = new PepperPizza();pizza.setName("胡椒披萨");}elsebreak;//输出pizza,制作过程pizza.prepare();pizza.bake();pizza.cut();pizza.box();}while (true);}//写一个方法,可以获取客户希望订购的披萨种类private String getType(){try {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));System.out.println("input pizza 类型:");String line = reader.readLine();return line;}catch (Exception e){e.fillInStackTrace();return null;}}
}
  1. PizzaStore类(测试)
package com.yqq.pattern.factory.simple.order;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/18/22:28* @Description: 相当于一个客户端,*/
public class PizzaStore {public static void main(String[] args) {new OrderPizza();}
}

2.3传统的方式的优缺点

  1. 优点是比较好理解,简单易操作。
  2. 缺点是违反了设计模式的ocp原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.
  3. 比如我们这时要新增加一个Pizza的种类(Pepper披萨),我们需要做如下修改.
    //新增PepperPizza类
    //增加一段代码 OrderPizza.java //写
//这里属于新增一个披萨类型后要修改使用方代码,违反了开闭原则else if (orderType.equals("pepper")){pizza = new PepperPizza();pizza.setName("胡椒披萨");}

三 使用简单工厂模式

改进的思路分析:

  1. 分析:修改代码可以接受,但是如果我们在其它的地方也有创建Pizza的代码,就意味着,也需要修改,而创建Pizza的代码,往往有多处。
  2. 思路:把创建Pizza对象封装到一个类中,这样我们有新的Pizza种类时,只需要修改该类就可,其它有创建到Pizza对象的代码就不需要修改了.-> 简单工厂模式

2.1基本介绍

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

2.2设计方案(类图分析)

简单工厂模式的设计方案: 定义一个可以实例化Pizaa对象的类,封装创建对象的代码。

2.3代码

  1. SimpleFactory 类
package com.yqq.pattern.factory.simple.order;import com.yqq.pattern.factory.simple.pizza.GreekPizza;
import com.yqq.pattern.factory.simple.pizza.PepperPizza;
import com.yqq.pattern.factory.simple.pizza.Pizza;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/18/23:33* @Description: 简单工厂*/
public class SimpleFactory {//创建披萨public Pizza createPizza(String orderType){Pizza pizza = null;if (orderType.equals("greek")){pizza = new GreekPizza();pizza.setName("希腊披萨");}else if (orderType.equals("cheese")){pizza = new GreekPizza();pizza.setName("奶酪披萨");}//这里属于新增一个披萨类型后要修改使用方代码,违反了开闭原则else if (orderType.equals("pepper")){pizza = new PepperPizza();pizza.setName("胡椒披萨");}return pizza;}
}
  1. OrderPizza类
package com.yqq.pattern.factory.simple.order;import com.yqq.pattern.factory.simple.pizza.GreekPizza;
import com.yqq.pattern.factory.simple.pizza.PepperPizza;
import com.yqq.pattern.factory.simple.pizza.Pizza;import java.io.BufferedReader;
import java.io.InputStreamReader;/*** Created with IntelliJ IDEA.** @Author: yqq* @Date: 2022/08/18/22:08* @Description: 使用方*/
public class OrderPizza {//构造器public OrderPizza(SimpleFactory simpleFactory){setFactory(simpleFactory);}//定义一个简单工厂对象SimpleFactory simpleFactory;Pizza pizza = null;public void setFactory(SimpleFactory simpleFactory){String orderType = "";//用户输入this.simpleFactory = simpleFactory;do {orderType = getType();pizza = this.simpleFactory.createPizza(orderType);//输出pizzaif (pizza != null){pizza.prepare();pizza.bake();pizza.cut();pizza.box();}else {System.out.println("订购披萨失败");break;}}while (true);}//写一个方法,可以获取客户希望订购的披萨种类private String getType(){try {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));System.out.println("input pizza 类型:");String line = reader.readLine();return line;}catch (Exception e){e.fillInStackTrace();return null;}}
}

【设计模式】-工厂模式->简单工厂模式(源码与类图解析)相关推荐

  1. 用Enterprise Architect从Java源码生成类图

    1.project---new project 建立工程,会弹出配置框,选择要包含的图形,只是分析代码结构,选择'class'类图即可(如下图),完成工程建立. 2.在右侧Project Browse ...

  2. ABP源码uml类图

    陆陆续续学习ABP框架有一段时间了,阳光铭睿的入门教程和HK Zhang的源码分析文章对我的学习帮助都很大.之所以会花这么大工夫去学习ABP.看ABP的源代码,一是因为本人对于DDD也非常有兴趣,AB ...

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

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

  4. 工厂设计模式(java版本、spring源码中使用的工厂模式)

    最近在学习spring源码,发现在IoC容器初始化的时候创建各种bean,然后在代码中看到各种beanFactory和factoryBean,很显然spring容器在创建bean的过程是使用了工厂设计 ...

  5. 设计模式-创建型模式-简单工厂模式

    工程地址:设计模式-简单工厂源码-C++文档类资源-CSDN下载C++设计模式-创建型模式-简单工厂模式源码更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.n ...

  6. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

    园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博 ...

  7. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录

    1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客前言 ...

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

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

  9. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂——区分“变与不变”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂--区分"变与不变" 先来说说构造器 在介绍工厂模式之前,为了辅助大家的理解,我想先在这儿给大家介绍 ...

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

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

最新文章

  1. 计算机网络概述---传输层 UDP和TCP
  2. anaconda 升级jupyter notebook_搭建 Python 轻量级编写环境(WSL2+Jupyter 自动开启本地浏览器)
  3. linq之Capacity(转载)
  4. [原创]微软网络协议数据分析工具 Microsoft Network Monitor 介绍
  5. C# Windows Phone 8 WP8 开发,取得手机萤幕大小两种方法。
  6. 为什么Segment会从微服务退回单体架构?
  7. 一张图看懂AR至GL数据流
  8. vue点击切换css样式
  9. MySQL性能优化(二)
  10. main方法_十个经典的 Java main 方法面试题
  11. (9)Zynq UART控制器介绍
  12. office完全卸载工具
  13. 有关圣诞节表白的c语言程序,关于圣诞节表白唯美的句子
  14. Google SketchUp Cookbook: (Chapter 5) Roofs: Constraints and Inferences
  15. 【VMware的坑爹之路】VMware复制文件卡死死机;无法访问网络地址“*:\“
  16. 服务器如果清理垃圾文件,为citrix服务器清理垃圾文件事件
  17. 关于“信息、物质、能量”,你所不知道的有趣联系
  18. 2.SPSS入门基础——数据录入数据管理编程规则图表可视化
  19. 常见的agv控制系统及功能有哪些?
  20. traceback说明

热门文章

  1. 虚拟化试题1-网络和存储
  2. 2021最新版谷歌浏览器百度网盘下载
  3. Axure各种版本注册码 | 最新Axure RP 8.1.0.3377的授权码
  4. 【目标跟踪】|MOSSE原理及对应代码解释 matlab C
  5. 软件测试:Lab 2 Selenium
  6. 麻省理工18年春软件构造课程阅读04“代码评审”
  7. louvain算法python_python – 如何在igraph中运行louvain社区检测算法?
  8. matlab m 调用mdl,[分享]MATLAB m语言中调用simulink的程序
  9. 软件工程专业学生的自我反思
  10. 解压.tar.bz2文件命令