设计模式之(2)——工厂方法模式

  • 定义:工厂方法模式又称为工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类来定义创建对象的接口,而子类负责生成具体的对象;
  • 主要作用:将类的实例化延迟到工厂类的子类中进行,由子类来决定该实例化哪一个类;
  • 解决的问题:上篇简单工厂设计模式中我们提到,工厂一旦需要生产新产品就需要修改简单工厂类的方法逻辑,这违反了程序设计的”开闭原则”,同时所有产品的创建都依赖一个同一个工厂类,这也与程序设计的”单一职责”相悖,如果这个类出现了问题,则有可能造成整个系统的瘫痪,所以我们的工厂方法模式就应运而生了;
  • *UML类图:

角色组成:

1、抽象产品(Product):具体产品的父类,主要描述具体产品的公共接口;

2、具体产品(ConcreteProduct):抽象产品的子类,工厂类创建的目标对象;

3、抽象工厂(Creator):具体工厂的父类,定义具体工厂中的公共接口;

4、具体工厂(ConcreteCreator):抽象工厂的子类,被外界调用,实现工厂方法创建具体产品的实例;

使用步骤:

1、创建抽象产品类,定义具体产品的一些公共接口;

2、定义具体产品类,继承抽象产品,定义生产的具体产品;

3、定义抽象工厂类,定义工厂类的生产产品的方法;

4、定义具体工厂类,继承抽象工厂类,定义具体生产的产品;

5、外界调用具体的工厂类的方法,从而创建不同的具体产品类的实例;

优点:

1、更加符合”开闭原则”,每增加一种新产品时,只需要增加相应的具体产品类和相应的具体工厂子类即可;

2、符合单一职责原则,每个具体的工厂类只负责创建一种对应的产品;

3、不使用静态工厂方法,可以形成基于继承的等级结构;

4、工厂方法模式在保留了简单工厂模式封装优点的同时,让扩展变得更简单,让继承变得可行;

缺点:

1、增加新产品时,除了新增加产品类之外,还要提供与之对应的工厂类,会造成系统中类的数目急剧膨胀,一定程度上增加了系统的复杂度,会给系统诸如类加载等等带来一些额外的开销;

2、考虑到系统的扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,在实现的时候可能需要用到DOM、反射等技术,增加了系统的实现难度;

3、一个具体工厂只能创建一种或者某种具体产品;

使用场景:

1、当一个类不知道他所需要对象的类时,工厂方法模式中,客户端不需要知道具体产品的类名,只需要知道其所对应的工厂即可;

2、当一个类希望通过子类来指定创建对象时,对于抽象工厂类只需要提供一个创建产品方法的定义,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏替换原则,在程序运行时,子类对象覆盖父类对象,从而使系统更容易扩展;

3、将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用的时候无需关心是哪一个类创建的具体的产品类,需要时再动态指定,可以将具体工厂类的名称存储在配置文件或者数据库中来实现;

Original: https://www.cnblogs.com/wha6239/p/16631228.html
Author: 一只烤鸭朝北走
Title: 设计模式之(2)——工厂方法模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612878/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 手把手教你定位线上MySQL锁超时问题,包教包会

    昨晚我在床上睡着了,突然来了一条短信。 [En] I was asleep in bed last night when suddenly a text message came….

    数据库 2023年5月24日
    084
  • java面试题总结

    1,集合类面试题 arraylist和linkedlist的区别?底层实现?手写实现?线程安全吗以及原因? hashmap的底层实现?put()执行过程?put null时的执行过…

    数据库 2023年6月11日
    091
  • haproxy

    haproxy 一.haproxy简介 二.负载均衡 三.haproxy安装 1.yum安装 2.源码安装 2.1 配置文件解析 2.2时间格式 2.3 全局global 2.4 …

    数据库 2023年6月14日
    074
  • web开发模式

    前后端不分离 返回的是html的内容,需要在服务端拿到数据库的数据,再渲染给模板层,最后将渲染好的模板返回给浏览器! 前后端分离 前后端分离:只需要在浏览器上运行JS代码,使用aj…

    数据库 2023年6月14日
    096
  • Intellij IDEA个人常用快捷键

    分享一下个人常用快捷键。 说明:字母排序规则遵循字母表(a->z) 快捷键 介绍 ctrl+b 快速打开当前光标处的类或方法 ctrl+d 复制当前光标所在行至下一行 ctr…

    数据库 2023年6月14日
    085
  • 2018年最新JAVA面试题总结之数据库(3)

    转自于:https://zhuanlan.zhihu.com/p/39804394 1、MySQL的delete与truncate区别? 回答:delete语句执行删除的过程是每次…

    数据库 2023年6月16日
    091
  • SQL中针对不规范数字order by排序的处理方式

    在操作数据库的时候经常需要order by进行排序,但是有的时候数据并没有很好的格式化导致排序的结果不合我们的心意,如下图: 如果我们要按照value进行排序的话,就会得到上面截图…

    数据库 2023年5月24日
    0114
  • Our Feeling

    走过春夏秋冬走过五湖四海就是没有走过你 看过日出日落看过潮起潮落就是看不到你 本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://…

    数据库 2023年6月11日
    0100
  • mysql入门到精通完整学习教程,基础入门-数据库实战

    Original: https://www.cnblogs.com/chaichaichai/p/15662164.htmlAuthor: 牛仔码农Title: mysql入门到精…

    数据库 2023年5月24日
    0101
  • 【黄啊码】MySQL入门—1、SQL 的执行流程

    大家好!我是黄啊码,鉴于大家对于学习的热情,从今天起,将连载mysql的相关知识,需要学习的可以注意我的更新学习,后期估计会开启付费专栏,但当前完全可以白嫖,希望大家珍惜! 首先我…

    数据库 2023年6月16日
    083
  • mysql创建用户并授权

    新建用户 create user ‘username’@’%’ identified by ‘password’; • user_name:要创建用户的名字。• host:表示要这…

    数据库 2023年5月24日
    065
  • 创建Django项目

    2022-09-24 在创建Django项目时,出现了 错误,查了一下,发现要创建一个Django项目,需要先使用命令: python -m pip install pytz 安装…

    数据库 2023年6月14日
    084
  • JUC学习笔记(七)

    1.1、读写锁介绍 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取…

    数据库 2023年6月6日
    0105
  • Handler_read_*的总结

    在分析一个SQL的性能好坏时,除了执行计划,另外一个常看的指标是”Handler_read_*”相关变量。 Handler_read_key Handler…

    数据库 2023年6月11日
    087
  • Linux 系统安装RocketMQ

    准备工作 1.去官网下载一个安装包 1.解压 unzip rocketmq-all-4.9.0-bin-release.zip -d /download/compress/ 2.进…

    数据库 2023年6月6日
    090
  • Matplotlib(基本用法)

    Matplotlib 是数据分析绘图的常见模块,可以算是 2D-绘图(Python)领域使用最广泛的套件,可以将数据图形化,并且提供多样化的输出格式,利于数据的显示并分析。 接下来…

    数据库 2023年6月16日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球