文章目录

  • 一、简单工厂模式简介
  • 二、简单工厂模式适用场景
  • 三、简单工厂模式优缺点
  • 四、简单工厂模式代码示例
    • 1、抽象类
    • 2、子类对象 1
    • 3、子类对象 2
    • 4、工厂类
    • 5、测试类

一、简单工厂模式简介


简单工厂模式 : 由 一个 工厂对象 决定 创建出 哪一种 产品类 的 实例 ;

简单工厂模式类型 : 创建型 ;

二、简单工厂模式适用场景


简单工厂模式适用场景 :

  • 创建对象少 : 工厂类 负责 创建的对象 比较少 ;

  • 不关心创建过程 : 客户端 只知道 传入 工厂类 的参数 , 对于 如何创建对象 不关心 ;

三、简单工厂模式优缺点


简单工厂模式优点 : 只需要传入 正确的参数 , 就可以 获取需要的对象 , 无需知道创建细节 ;
工厂类中有必要的 判断逻辑 , 可以决定 根据当前的参数 创建对应的产品实例 , 客户端可以免除直接创建产品对象的责任 ;
通过该模式 , 实现了对 创建实例 和 使用实例 的 责任分割 ;
提供专门的 工厂类 用于创建对象 , 客户端 无需知道所创建的产品类的类名 , 只需要知道对应产品类的参数即可创建对象实例 ;

简单工厂模式缺点 : 工厂类 职责 过重 , 如果要增加新的产品 , 需要 修改工厂类的判断逻辑 , 违背 " 开闭原则 " ;
777 大设计原则 , 不能全部遵守 , 也不能不遵守 , 注意平衡 功能 和 系统复杂度 , 找到最合适的一个点 ;

四、简单工厂模式代码示例


1、抽象类

package simplefactory;/*** 视频抽象*/
public abstract class Vedio {/*** 生产视频*/public abstract void produce();
}

2、子类对象 1

package simplefactory;public class JavaVedio extends Vedio {@Overridepublic void produce() {System.out.println("录制 Java 视频");}
}

3、子类对象 2

package simplefactory;public class PythonVedio extends Vedio {@Overridepublic void produce() {System.out.println("录制 Python 视频");}
}

4、工厂类

简单工厂模式的缺点 : 如果要增加新的课程如 C 课程 , 就需要修改 getVedio 方法 , 在该方法中添加新的分支 , 明显该操作违反了开闭原则 , 对扩展开方 , 对修改关闭 , 只要修改就会带来风险 ;

使用传入 Class 参数的方法 , 可以解决上述问题 , 如果要扩展 , 只需要传入不同的 Class 类即可 , 不需要修改工厂方法 ;

代码示例 :

package simplefactory;/*** 简单工厂模式的缺点 :*      如果要增加新的课程如 C 课程 , 就需要修改 getVedio 方法*      在该方法中添加新的分支*      明显该操作违反了开闭原则 , 对扩展开方 , 对修改关闭*      只要修改就会带来风险** 使用传入 Class 参数的方法 , 可以解决上述问题 , 如果要扩展*      只需要传入不同的 Class 类即可*/
public class VedioFactory {/*** 根据传入的参数 , 创建不同的 Vedio 子类实例对象*      该方法不符合开闭原则*      如果增加新的 Vedio 子类 , 需要修改本方法 , 增加新的分支* @param type* @return*/public Vedio getVedio(String type) {Vedio vedio = null;if ("Java".equals(type)) {vedio = new JavaVedio();} else if ("Python".equals(type)) {vedio = new PythonVedio();}return vedio;}/*** 根据传入的参数 , 创建不同的 Vedio 子类实例对象*      该方法符合开闭原则*      如果增加新的 Vedio 子类 , 不需要修改本方法* @param clazz* @return*/public Vedio getVedio(Class<?> clazz) {Vedio vedio = null;// 通过反射创建对象try {vedio = (Vedio) Class.forName(clazz.getName()).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return vedio;}
}

5、测试类

package simplefactory;public class Main {public static void main(String[] args) {// 如果直接创建 JavaVedio//      那么本类需要依赖 JavaVedio , 即导入 JavaVedio 依赖Vedio javaVedio = new JavaVedio();javaVedio.produce();// 如果直接创建 PythonVedio//      那么本类需要依赖 PythonVedio , 即导入 PythonVedio 依赖Vedio pythonVedio = new PythonVedio();pythonVedio.produce();System.out.println();// 使用工厂类 , 可以避免直接依赖被创建的类//      不管创建多少种类的实例对象 , 只需要依赖一个工厂类即可Vedio javaVedio2 = new VedioFactory().getVedio("Java");javaVedio2.produce();Vedio pythonVedio2 = new VedioFactory().getVedio("Python");pythonVedio2.produce();}
}

执行结果 :

录制 Java 视频
录制 Python 视频录制 Java 视频
录制 Python 视频

【设计模式】简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )相关推荐

  1. 【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.建造者模式简介 二.建造者模式适用场景 三.建造者模式优缺点 四.建造者模式与工厂模式 五.建造者模式代码示例 1.学生类 2.建造者抽象类 3.建造者实现类 4.教师类 ( 非必须 ) ...

  2. 【设计模式】模板方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.模板方法模式简介 二.模板方法模式适用场景 三.模板方法模式优缺点 四.模板方法扩展 五.模板方法模式相关设计模式 六.模板方法模式代码示例 1.模板方法抽象类 2.模板方法实现类 1 ...

  3. 【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.策略模式简介 二.策略模式适用场景 三.策略模式优缺点 四.策略模式与其它设计模式 五.策略模式代码示例 1.促销策略接口 2.满减促销策略 3.返现促销策略 4.空促销策略 5.促销策 ...

  4. 【设计模式】状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.状态模式简介 二.状态模式适用场景 三.状态模式优缺点 四.状态模式相关设计模式 五.状态模式代码示例 1.状态类父类 2.播放状态类 3.暂停状态类 4.快进状态类 5.停止状态类 6 ...

  5. 【设计模式】访问者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.访问者模式简介 二.访问者模式 适用场景 三.访问者模式 优缺点 四.访问者模式 与 迭代器模式 五.代码示例 1.Game 父类 ( 被访问者 ) 2.VipGame 收费游戏 ( 被 ...

  6. 【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.桥接模式简介 二.桥接模式适用场景 三.桥接模式优缺点 四.桥接模式相关设计模式 五.桥接模式代码示例 1.视频格式抽象 2.FLV 视频格式实现 3.MP4 视频格式实现 4.系统平台 ...

  7. 【设计模式】解释器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.解释器模式简介 二.解释器模式适用场景 三.解释器模式优缺点 四.解释器模式与适配器模式 五.解释器模式代码示例 1.解释器接口 2.加法解释器 3.乘法解释器 4.整型解释器 5.语法 ...

  8. 【设计模式】组合模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.组合模式简介 二.组合模式适用场景 三.组合模式优缺点 四.组合模式和访问者模式 五.组合模式代码示例 1.书籍和目录的抽象父类 2.书籍类 3.目录类 4.测试类 一.组合模式简介 组 ...

  9. 【设计模式】迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.迭代器模式简介 二.迭代器模式适用场景 三.迭代器模式优缺点 四.迭代器模式和访问者模式 五.迭代器模式代码示例 1.迭代器接口 2.迭代器实现 3.集合元素实例类 4.集合管理接口 5 ...

  10. 【设计模式】备忘录模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.备忘录模式简介 二.备忘录模式 适用场景 三.备忘录模式 优缺点 四.备忘录模式 与 状态模式 五.备忘录模式 代码示例 1.文档类 2.文档备忘录类 3.文档备忘录管理类 4.测试类 ...

最新文章

  1. 吴甘沙:天外飞“厕”、红绿灯消失,未来无人驾驶将被重新定义 | AI ProCon 2019
  2. 一文读懂:完整的支付系统整体架构
  3. 2014/12/05 随笔 2014-12-05 12:50 26人阅读 评论(0) 收藏...
  4. mysql中Invalid default value for 'stime'问题
  5. 判定Java源文件名称_JAVA
  6. 转:如何调用另一个python文件中的代码
  7. 11_拼接与拆分,cat,stack,split,chunk
  8. redis的五种数据结构
  9. php 面相对象设计,PHP面向对象设计的规范
  10. 光纤光信号闪红灯_光纤猫光信号闪红灯
  11. 用Quartus仿真计数器模块:
  12. 深度学习图像分类问题涨分总结
  13. iOS设备的越狱方法
  14. 关于未知的USB设备(设备描述符请求失败)的解决方法
  15. Flutter CircularProgressIndicator圆形进度指示器
  16. c语言程序 输入一个四位数,用c语言编程:输入一个四位数,求出它的个位、十位、百位、千位...
  17. php首字母改大写,php实现字符串首字母转换成大写的方法
  18. 机器学习小组知识点4:批量梯度下降法(BGD)
  19. zblog插件-zblog插件zblog主题必备小插件
  20. 从购买ECS到SpringCloud项目的自动化部署及发布

热门文章

  1. java培训之XML学习笔记(1)
  2. C#中的session用法
  3. abb机器人goto指令用法_ABB机器人程序指令解读,建议收藏
  4. 跑分cpu_跑分完爆骁龙 865?明年这些中端处理器真的要起飞
  5. x99对应服务器芯片,x99主板配什么cpu 几款x99主板介绍【详细介绍】
  6. 第jiu届蓝桥杯单片机省赛真题_2018第九届蓝桥杯省赛真题 C语言B组 第二题
  7. windows10 企业版 ltsc系统的激活
  8. 自动驾驶中的三维目标检测综述
  9. Laplace锐化算子和LOG算子
  10. ndk读取assets文件