文章目录

  • 一、工厂方法模式简介
  • 二、工厂方法模式适用场景
  • 三、工厂方法模式优缺点
  • 四、工厂方法模式代码示例
    • 1、产品抽象类
    • 2、产品实现类 1
    • 3、产品实现类 2
    • 4、抽象工厂类
    • 5、实现工厂类 1
    • 6、实现工厂类 2
    • 7、测试类
  • 五、扩展上述工厂方法模式
    • 1、扩展的产品实现类
    • 2、扩展的工厂实现类
    • 3、测试类

一、工厂方法模式简介


工厂方法模式 : 定义一个 创建对象 的 接口 , 让 实现这个接口的子类 决定 实例化哪个类 , 工厂方法让 类的实例化 推迟到子类中进行 ;

工厂方法模式类型 : 创建型 ;

创建 实例对象 过程可能会很复杂 , 有可能会 导致大量的重复代码 , 工厂方法模式 通过 定义 一个单独的 创建 实例对象 的方法 , 解决上述问题 ;
通过 子类 实现 这个方法 , 创建具体的 实例对象 ;

二、工厂方法模式适用场景


工厂方法模式适用场景 :

  • 重复代码 : 创建对象 需要使用 大量重复的代码 ;
  • 不关心创建过程 : 客户端 不依赖 产品类 , 不关心 实例 如何被创建 , 实现等细节 ;
  • 创建对象 : 一个类 通过其 子类 来 指定 创建哪个对象 ;

客户端 不需要知道 具体 产品类 的 类名 , 只需要知道 所对应的工厂 即可 , 具体的产品对象 , 由对应的工厂创建 , 客户端只需要知道 产品 对应的 工厂 ;
工厂方法模式 利用了 面向对象 的 多态性 , 和 里式替换 原则 ;
子类对象 覆盖 父类对象 , 使 系统 更容易扩展 , 将 创建对象的过程 推迟到子类实现 , 创建对象的任务 , 委托给 多个 工厂子类 中的某一个 , 客户端不需要关心是哪个 工厂子类 创建的 产品对象 ;
工厂子类 一般都是 需要的时候 , 动态指定 ;

三、工厂方法模式优缺点


工厂方法模式优点 :

  • 不关心创建细节 : 用户 只需要 关心 所需产品 对应的工厂 , 无需关心创建细节 ;
  • 符合开闭原则 : 加入 新产品 , 符合开闭原则 , 提高可扩展性 ;

工厂方法模式 中 , 使用 工厂类创建 产品对象 , 同时 隐藏了 具体的 产品类 被 实例化 的细节 ;

工厂方法模式缺点 :

  • 增加复杂性 : 类的个数容易过多 , 增加系统复杂度 ;
    在 添加新产品 时 , 除了编写 新的产品类 之外 , 还要 编写该产品类对应的 工厂类 ;
  • 增加难度 : 增加了系统 抽象性 和 理解难度 ;
    工厂方法本身 利用了抽象 , 该模式中会 引入抽象层 , 如果要动态创建产品类 , 还要 引入反射技术 ;

设计模式 的 使用 , 要根据 实际的 业务场景 , 模型 综合平衡考量 , 不能过分遵守设计原则 和 设计模式 ;

四、工厂方法模式代码示例


1、产品抽象类

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

2、产品实现类 1

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

3、产品实现类 2

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

4、抽象工厂类

注意看注释 :

package factorymethod;/*** 工厂类抽象*      具体的创建 产品对象 的工厂类 , 继承该抽象类*      客户端实际创建对象时 , 调用的是工厂类子类实现** 该类中只有 1 个抽象方法 , 也可以使用接口进行定义 工厂类 抽象*      但在实际的业务场景中 , 工厂类的某些属性 或 某些行为是已知的*      需要提前定义出来 , 接口就无法完成该定义*      因此 , 一般情况下 工厂抽象 使用 抽象类进行定义 , 不使用接口** 产品等级 : 相同类型的产品 , 称为产品等级*      对于生产 Vedio 都是同一个产品等级*      Java 视频 和 Python 视频 的产品等级一致 , 都是视频*      二者 的 等级 都在 视频这个等级上** 产品族 : 与 产品等级 相对应的概念是 产品族*      这是区分 工厂方法模式 和 抽象工厂模式 的重要概念*      如果每个视频有配套的解说 , 那么 视频 与 解说 是同一个产品族** 工厂方法模式 用于解决 同一个产品等级 的业务抽象问题** 具体产生 什么类型的视频*      由 VedioFactory 的子类 JavaVedioFactory / PythonVedioFactory 决定*      不是由 VedioFactory 决定*      VedioFactory 只规定 规范 契约*          不规定产生哪个类型的视频**  扩展 :*      如果要扩展一个新类型的视频 , 如 Kotlin 视频*      只需要新增加一个 Vedio 子类 和 一个 VedioFactory 子类 即可*/
public abstract class VedioFactory {/*** 创建 Vedio 实例对象的方法由 子类 实现* @return*/public abstract Vedio getVedio();
}

5、实现工厂类 1

package factorymethod;/*** 生产 Java 视频 对象实例 的工厂子类*/
public class JavaVedioFactory extends VedioFactory {@Overridepublic Vedio getVedio() {return new JavaVedio();}
}

6、实现工厂类 2

package factorymethod;/*** 生产 Python 视频 对象实例 的工厂子类*/
public class PythonVedioFactory extends VedioFactory {@Overridepublic Vedio getVedio() {return new PythonVedio();}
}

7、测试类

package factorymethod;public class Main {public static void main(String[] args) {// 创建 Java 视频工厂类VedioFactory javaVedioFactory = new JavaVedioFactory();// 调用工厂类创建产品Vedio javaVedio = javaVedioFactory.getVedio();// 视频生产javaVedio.produce();// 创建 Python 视频工厂类VedioFactory pythonVedioFactory = new PythonVedioFactory();// 调用工厂类创建产品Vedio pythonVedio = pythonVedioFactory.getVedio();// 视频生产pythonVedio.produce();}
}

执行结果 :

录制 Java 视频
录制 Python 视频

五、扩展上述工厂方法模式


如果要扩展一个新类型的视频 , 如 Kotlin 视频 ;

只需要新增加一个 Vedio 子类 和 一个 VedioFactory 子类 即可 ;

1、扩展的产品实现类

package factorymethod;public class KotlinVedio extends Vedio {@Overridepublic void produce() {System.out.println("录制 Kotlin 视频");}
}

2、扩展的工厂实现类

package factorymethod;/*** 生产 Kotlin 视频 对象实例 的工厂子类*/
public class KotlinVedioFactory extends VedioFactory {@Overridepublic Vedio getVedio() {return new KotlinVedio();}
}

3、测试类

package factorymethod;public class Main {public static void main(String[] args) {// 创建 Java 视频工厂类VedioFactory javaVedioFactory = new JavaVedioFactory();// 调用工厂类创建产品Vedio javaVedio = javaVedioFactory.getVedio();// 视频生产javaVedio.produce();// 创建 Python 视频工厂类VedioFactory pythonVedioFactory = new PythonVedioFactory();// 调用工厂类创建产品Vedio pythonVedio = pythonVedioFactory.getVedio();// 视频生产pythonVedio.produce();// 创建 Kotlin 视频工厂类VedioFactory kotlinVedioFactory = new KotlinVedioFactory();// 调用工厂类创建产品Vedio kotlinVedio = kotlinVedioFactory.getVedio();// 视频生产kotlinVedio.produce();}
}

执行结果 :

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

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

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

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

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

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

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

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

  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 ...

最新文章

  1. hashmap底层原理_Java集合 - HashMap原理(一) 概念和底层架构
  2. Jerry带您了解Restful ABAP Programming模型系列之二:Action和Validation的实现
  3. Jsの练习-数组常用方法
  4. 极兔速递完成17.35亿美元融资?回应:不实消息
  5. 《一天搞懂深度学习》--李宏毅
  6. 线性分类的鸢尾花数据集Jupyter实践
  7. 绝妙:永不过期的刷Q币技巧 - bh
  8. A 5G Odyssey :2021北京漫游
  9. 手机通信专有名词中英文
  10. win7不显示移动硬盘_如何在移动硬盘中安装win10系统?
  11. [52PJ] Java面向对象笔记(转自52 1510988116)
  12. 50个安卓开发者应该熟悉的Android Studio技巧和资源
  13. 税务会计实务【13】
  14. mysql建库1044_Mysql创建数据库时提示Error 1044
  15. 搭建量化交易系统接口的步骤是什么?
  16. 输入一个URL之后到页面加载的整个过程分析
  17. 编程初学者为什么要首选Java?
  18. 怎样才能掘金知识付费项目?
  19. Vue第二天学习总结—— Vue全家桶之组件化开发(组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互传递、组件插槽、基于组件的案例——购物车)
  20. 在Ubuntu系统上在线下载/删除/查看软件包信息apt命令

热门文章

  1. 各种SSD SMART 信息 转
  2. 谷歌彩蛋-让搜索结果页面下雪、旋转、倾斜
  3. python怎么设置七牛云_详解Python在七牛云平台的应用(一)
  4. acwing3红与黑
  5. 在线密码破解教程,web登录爆破(hydra的简单使用)
  6. Session详解,学习Session,这篇文章就够了(包含底层分析和使用)
  7. 中软国际面试-c开发
  8. QQ浏览器使用axios上传文件为空的问题
  9. 为什么超三成制造企业上市公司选择用友U9 cloud?
  10. 编程故事很长,慢慢书写