本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删.

工厂模式的由来:
  在现实生活中我们都知道,原始社会自给自足(没有工厂)、农耕社会有了小作坊(简单工厂)、工业革命后有了流水线(工厂方法)、现代产业链有代工厂(抽象工厂)等。
  我们的项目代码同样是由简到繁一步一步迭代来的,但是对于调用者来说却是越来越简单化了。

简单工厂模式:

  是指由一个工厂对象决定创建哪一种产品类的实例,但它不属于23种常用设计模式,简单工厂模式适用于工厂类负责创建的对象较少的场景,切客户端只需要传入工厂类的参数,对于如何创建对象不需要关心。
  话不多说,以代码举例:
  现在有个学校,开设有Java架构、大数据、人工智能等课程,已经形成了一个生态。我们定义一个课程标准ICourse接口:

public interface ICourse {/*** 录制视频*/public void record();
}

再创建一个Java课程的实现JavaCourse类:

public class JavaCourse implements ICourse{@Overridepublic void record() {System.out.println("录制Java课程");}
}

我们这样假设客户端调用代码:

public class Main {public static void main(String[] args) {ICourse course = new JavaCourse();course.record();}
}

  在上面的代码中,父类ICourse指向子类JavaCourse的引用,应用层代码需要依赖JavaCourse,如果业务扩展,继续增加PythonCourse甚至更多课程,那么客户端的依赖会变得越来越臃肿。因此,我们要想办法把这种依赖减弱,把创建细节隐藏起来。虽然在目前的代码中,创建对象的过程并不复杂,但从代码设计的交付来讲,不易于扩展。现在,我们用简单工厂模式对代码进行优化:
学校增加了python课程:

public class PythonCourse implements ICourse{@Overridepublic void record() {System.out.println("录制Python课程");}
}

创建工厂类:CourseFactory:

public class CourseFactory {public ICourse creat(String name){if("java".equals(name)){return new JavaCourse();}else if("python".equals(name)){return new PythonCourse();}else {return null;}}
}

修改客户端调用代码如下:

public class Main {public static void main(String[] args) {CourseFactory factory = new CourseFactory();factory.creat("java");}
}

为了调用方便我们可以将工厂的方法转为静态方法,客户端调用变简单了,但是如果我们的业务继续拓展,要增加前端课程,那么工厂中的create()方法就要每次都根据产品修改代码逻辑,不符合开闭原则。因此,我们还可以对简单工厂模式继续优化,这次我们采用反射优化:

public class CourseFactory {public static ICourse creat(String className){try {if(!(null==className||"".equals(className))){return (ICourse) Class.forName(className).newInstance();}} catch (Exception e) {e.printStackTrace();} return null;}
}

修改客户端调用代码:

public class Main {public static void main(String[] args) {CourseFactory factory = new CourseFactory();ICourse course = factory.creat("com.设计模式.简单工厂.JavaCourse");course.record();}
}

优化之后,产品不断丰富的过程中不需要修改CourseFactory中的代码。但是还有个问题,方法参数是字符串,可控性有待提示,而且还需要强制转型,再修改一下工厂代码:

public class CourseFactory {public static ICourse creat(Class <? extends ICourse> clazz){try {if(null != clazz){return clazz.newInstance();}} catch (Exception e) {e.printStackTrace();}return null;}
}

优化客户端代码:

public class Main {public static void main(String[] args) {CourseFactory factory = new CourseFactory();ICourse course = factory.creat(JavaCourse.class);course.record();}
}

这样看起来就比较接近Spring中的使用了:
比如logback中LoggerFactory中有多个重载的方法,getLogger():

    public static Logger getLogger(String name){ILoggerFactory iLoggerFactory = getILoggerFactory();return iLoggerFactory.getLogger(name);}public static Logger getLogger(Class clazz){return getLogger(clazz.getName());}

简单工厂模式也有他的缺点:工厂类的职责相对过重,不易于扩展过于复杂的产品结构。

Spring常用设计模式--简单工厂模式相关推荐

  1. Unity3D常用设计模式之工厂模式

    Unity3D常用设计模式<工厂模式>   工厂模式(Factory Pattern)是游戏开发中比较常用的设计模式.这种类型的设计模式属于创建型模式,它提供了一种创建对象实例的最佳方式. ...

  2. Android常用设计模式之工厂模式理解

    Android常用设计模式之工厂模式 前言 工厂模式 普通工厂模式 普通工厂模式例子 简单工厂模式总结: 简单工厂模式优缺点: 抽象工厂模式 抽象工厂模式的例子 抽象工厂模式小结 抽象工厂模式优缺点 ...

  3. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  4. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  5. 设计模式—简单工厂模式

    前言 简单工厂模式是一种比较容易理解的设计模式 简单工厂模式介绍 在设计模式中,简单工厂模式可以理解为负责生产对象的一个类,当使用new 关键字创建一个对象时,此时该类就依赖于这个对象,也就是他们间的 ...

  6. 设计模式 - 简单工厂模式

    文章目录 设计模式 - 简单工厂模式 1.意图 2.实例 1.创建颜色接口 - 定义生产的产品是什么 2.创建颜色枚举 - 定义生产哪些类型的产品 3.根据颜色枚举创建产品 - 根据产品清单生产产品 ...

  7. android常用的工厂模式,Android的设计模式-简单工厂模式

    前言 Android的设计模式系列文章介绍,欢迎关注,持续更新中:java 1.定义 定义一个用于建立对象的接口,让子类决定实例化哪一个类.设计模式 2.介绍 简单工厂模式属于建立型模式. 简单工厂模 ...

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

    什么是工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对 ...

  9. 初学Java常用设计模式之——工厂模式

    声明:转载请附上原文链接 提示:标题序号从2开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--单例模式 序号从1开始 2. 工厂模式(常用) ⼯⼚模式介绍 ...

最新文章

  1. 正则表达式分类 区别
  2. 教育培训机构用管理系统能做什么?
  3. mcrypt_module_open php,求PHP7.1 加密函数mcrypt_module_open()替换方案
  4. 为你详细解读HTTP请求头(header)的具体含意
  5. 数据挖掘之数据预处理
  6. 视频图像不正常的几个表现及解决方法
  7. 十九、MySQL常用命令总结
  8. 推荐一个比FiddlerCore好用的HTTP(S)代理服务器
  9. 【GDB调试学习笔记】利用core文件调试程序
  10. 2019年互联网大厂月饼大盘点,最丑的一家竟然是...
  11. android idle模式
  12. 在python3.X中执行python manage.py migrate命令的坑
  13. UIAutomator源码分析之启动和运行
  14. Log4Cpp 使用实例
  15. cad刷新快捷键_掌握了这些实用的CAD技巧,比别人出图快一小时不止
  16. 【BP预测】基于BP神经网络实现混凝土强度预测含Matlab源码
  17. 小学计算机面试说课稿,小学信息技术面试说课稿(模板)
  18. 比特率(码率) = 采样率 (Sampling rate ) * 位深 (Bit depth)* 声道数目/Opus/AAC/mp3
  19. linux telnet trying,telnet ip port 显示trying一般是什么情况?急。。。
  20. ajax treegrid 选中,easyui treeGrid异步加载子节点示例

热门文章

  1. 接口自动化测试(1)
  2. python开头注释
  3. jsp学生体育成绩管理系统
  4. ibm服务器 产品型号对应表,IBM服务器配件型号及编号列表
  5. 科技交流英语(2022秋)Unit 5 test
  6. 中国联通物联网平台能力介绍
  7. python制作聊天机器人_如何制作一个聊天机器人?
  8. 只会用Excel吗?这套全面的数据分析工具打包送你,拿走不谢
  9. 网页打印宋体不支持加粗效果
  10. PDF Reader Pro for mac(全能pdf阅读器)