简单工厂模式Simple Factory

  • 为什么要有设计模式?
  • 简单工厂模式的类图
  • 简单工厂模式的例子
    • 产品
    • 生产者
    • 消费者
    • 执行结果
  • 后记
  • 鸣谢

为什么要有设计模式?

一个有价值的系统总是会因为需求的变化而变化,可能是原有需求的修改,也可能是新需求的增加。于是可怜的猿们就得修改原来的代码,不知道大家是否和我一样,非常讨厌修改已有的,更喜欢去做新的。好的架构和设计可以让我们的代码结构具有良好的扩展性,在满足需求变化的同时仅需要修改尽可能少的代码,可以将需求变化对原系统的影响降到很低。
设计模式就是人们对于良性架构设计的经验总结。

简单工厂模式的类图

简单工厂模式的例子

通常涉及到三个角色,即产品,生产者以及消费者。

产品

产品就是你要用到的工具类,一般有抽象产品和具体产品。抽象产品仅仅定义有什么功能,所以应该是接口,如果有产品的共有行为可以有抽象类,具体产品则应该对抽象产品定义的功能有具体的实现。

/*** 抽象产品:工具接口*/
public interface ITool {// 使用工具void run(String something);
}
/*** 具体产品:书*/
public class Book implements ITool {private final String type;public Book(String type) {this.type = type;}@Overridepublic void run(String something) {System.out.println("阅读一本" + type + "书->" + something);}
}
/*** 具体产品:钢笔*/
public class Pen implements ITool {private final String color;public Pen(String color) {this.color = color;}@Overridepublic void run(String something) {System.out.println("使用一枝" + color + "钢笔->" + something);}
}

生产者

生产者应该负责产品的生产细节,对此应该高内聚,并不关心产品有什么功能,也不关心消费者如何使用产品。

//生产者:工具商店
public class ToolStore {/*** 生产工具* @param toolName* @return*/public static ITool factory(String toolName) {switch (toolName) {// 笔case "黑颜色笔":return new Pen("黑色");//break;case "透明颜色笔":return new Pen("透明");//break;// 书case "数学书":return new Book("数学");//break;case "无字天书":return new Book("无字");//break;default:throw new RuntimeException("本店不卖这个工具:" + toolName);//break;}}
}

消费者

消费者是事件的主体,用什么干什么都是消费者的事情。但是产品怎么生产的,和产品具体如何完成事情不应该是消费者关心的事情。消费者向工厂提出需求,仅仅是对接口功能的需求,而工厂返回的是完成功能的具体子类。

/*** 消费者:人*/
public class Person {private final String name;public Person(String name) {this.name = name;}/*** 使用工具做某事* @param tool* @param something*/public void doSomeThing(ITool tool, String something) {System.out.print(name + ":");tool.run(something);}public static void main(String[] args) {// 一切的开始// 一个苦逼的猿诞生了Person person = new Person("乐意");// 此处没花钱,程序的世界,大家都是朋友,要互相帮助// 买本书ITool book = ToolStore.factory("数学书");// 笔也一起买了ITool pen = ToolStore.factory("黑颜色笔");person.doSomeThing(book, "学习数学知识");person.doSomeThing(pen, "记录学习笔记");// 一切的结束}
}

执行结果

后记

试想,如果消费者负责生产产品,则消费者和具体产品就有了耦合,如果有一天具体产品的生产方式需要修改(比如,笔的构造器除了颜色还有粗细),所有的消费者都要修改。又或者某一天想使用另外一个具体产品去完成某个功能(比如,想把用黑颜色笔的所有模块从钢笔换成中性笔),则用到该具体产品的地方也都要修改。这是非常不合理的。而使用了工厂,则仅仅会把修改蔓延至工厂。从此也可以看出简单工厂模式,对于扩展来说,并不是不需要修改任何角色,通常作为生产者的工厂是需要修改的。

鸣谢

非常感谢你花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,欢迎指正。欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

JAVA设计模式-创建模式-工厂模式-简单工厂模式/静态工厂模式相关推荐

  1. JAVA设计模式 - 创建型模式总结

    JAVA设计模式 - 单例模式 JAVA设计模式 - 工厂方法模式 JAVA设计模式 - 抽象工厂模式 JAVA设计模式 - 原型模式 JAVA设计模式 - 建造者模式 1 . 创建型模式的定义 顾名 ...

  2. java设计模式——创建型之建造者模式

    自大学课程初识设计模式以来,就越发觉得有必要系统学习一下设计模式. 刚好在实习前准备期间课比较少,抽出一点时间整理一下记一些笔记,复制粘贴比较多. 笔记比较适合学习过设计模式的同学. Builder ...

  3. Java设计模式 创建模式-单态模式(Singleton)

    2019独角兽企业重金招聘Python工程师标准>>> 定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目 ...

  4. 从零开始学习Java设计模式 | 创建型模式篇:原型模式

    在本讲,我们来学习一下创建型模式里面的第四个设计模式,即原型模式. 概述 原型模式就是指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象. 这段话读起来有点绕,是不是? ...

  5. 【Java设计模式 - 创建型模式1】单例模式

    java设计模式之单例模式 简介 场景 实现 单例模式的几种实现方式 懒汉式,线程不安全 懒汉式,线程安全 饿汉式 双检锁/双重校验锁(DCL,即 double-checked locking) 登记 ...

  6. Java设计模式之从[暗黑破坏神装备镶嵌宝石系统]分析桥接(Bridge)模式

    暴雪公司著名的游戏暗黑破坏神中,有一个经典的"镶嵌系统",例如,可以为武器镶嵌红宝石.蓝宝石来得到攻击特效或攻击力加成,为防具镶嵌红宝石.蓝宝石来得到攻击特效或者防御力的加成.不同 ...

  7. Java设计模式之单例模式(附简单案例)

    一.简单描述 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负 ...

  8. Java Web创建并运行一个简单的网页

    @创建并运行一个简单的网页TOC 在使用eclipse创建运行一个web项目前,需安装和配置好Tomcat和jre. 1.新建一个项目 2.选择过滤器文本Dynamic Web Project 3.输 ...

  9. 从零开始学习Java设计模式 | 创建型模式篇:抽象工厂模式

    在本讲,我们来学习一下创建型模式里面的第三个设计模式,即抽象工厂模式. 前言 前面介绍的工厂方法模式中考虑的是一类产品,如畜牧场只养动物.电视机厂只生产电视机(不生产空调.冰箱等其它的电器).计算机学 ...

最新文章

  1. 数组公式基本功修炼之深入使用
  2. python文件命名可以用中文吗-已经十多年了!你知道 Python 可以用中文命名变量吗?...
  3. mysql 查看导出数据字典
  4. java 反射无参方法_java 反射 调用无参数方法?
  5. 格式化字符串漏洞利用 六、特殊案例
  6. mybatis一个方法执行多条sql_精尽MyBatis源码分析——SQL执行过程之Executor!
  7. 重载 重写 多态区别
  8. 无限路由器故障排查细则
  9. linux三剑客之sed命令,linux三剑客之sed命令
  10. 小学计算机余数在线,余数计算器-余数计算器
  11. win10红警2黑屏_Windows10黑屏常见情况及解决办法
  12. 已经买好了域名后怎么建立一个网站
  13. 解决JSONNull导致的JSONObject序列化问题
  14. 目前常用 心电数据库ECG:MITBIH,AHA,CSE,ST-T,PTB,PAF 详细介绍+下载
  15. 总结Android系统启动完整流程(六)
  16. 各大工作室都在用的视觉特效软件,开启你的虚拟制作之旅
  17. Android camera2扫描
  18. 认识计算机系统学反思,《认识计算机》教学反思
  19. win+D无法回到桌面
  20. PDF合并在电脑上怎样实现?PDF合并的方法有哪些?

热门文章

  1. Electron主进程渲染进程间通信的四种方式
  2. 「需求广场」需求词更新明细(七)
  3. Ribbon负载均衡策略初步解读
  4. Typora使用快捷键
  5. hdu - 1789 题解
  6. 【亲测可用】解决Ultra iso软碟通写入硬盘映像时 硬盘映像容量太小问题
  7. Oracle:错误码ORA-28040 的坑
  8. 根据year年的第week周,查询第week周的起止时间
  9. ContentProvider基本使用初探
  10. 《外星人入侵》 教程详解