设计模式-工厂模式/抽象工厂模式

server/2025/1/17 18:50:10/

工厂模式

定义

        定义一个创建对象的接口,让子类决定实列化哪一个类,工厂模式使一个类的实例化延迟到其子类;

  • 工厂方法模式是简单工厂模式的延伸。在工厂方法模式中,核心工厂类不在负责产品的创建,而是将具体的创建工作交给子类去完成。也就是后所这个核心工厂仅仅只是提供创建的接口,具体实现方法交给继承它的子类去完成。当我们的系统需要增加其他新的对象时,我们只需要添加一个具体的产品和它的创建工厂即可,不需要对原工厂进行任何修改,这样很好地符合了“开闭原则”。

类图

角色

  • Product :抽象产品。所有的产品必须实现这个共同的接口,这样一来,使用这些产品的类可以引用这个接口,而不是具体类

  • ConcreteProduct :具体产品

  • Creator:抽象工厂,它实现了所有操纵产品的方法,但不实现工厂方法。Creator 所有的子类都必须要实现

  • ConcreteCreator:具体工厂。制造产品的实际工厂。它负责创建一个或者多个具体产品,只有ConcreteCreator 类知道如何创建这些产品。

优缺点

  • 优点:
    • 在工厂方法中,用户只需要知道所要产品的具体工厂,无须关心具体的创建过程,甚至不需要具体产品的类名。
    • 在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对工厂进行任何修改,很好的符合了“开闭原则”
  • 缺点:
    • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

使用场景

  • 一个类不知道它所需要的对象的类。在工厂方法模式中,我们不需要具体产品的类名,我们只需要知道创建它的具体工厂即可
  • 一个类通过其子类来指定创建那个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象。在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
  • 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无需关系是哪一个工厂子类创建产品子类,需要时再动态指定。

抽象工厂模式

定义

        提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类;

类图

角色

  • 抽象工厂角色:描述具体工厂的公共接口,是具体工厂的父类
  • 具体工厂角色:描述具体工厂,创建产品的实例,供外界调用,主要实现了抽象工厂中的抽象方法,完成具体产品的创建
  • 抽象产品角色:抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
  • 具体产品角色:具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法,由具体工厂来创建,它同具体工厂之间一一对应。

产品族和产品等级

  • 产品族:一个品牌下面的所有产品;例如华为下面的手机,路由器,电脑称为华为产品的产品族
  • 产品等级:多个品牌下面的同种产品;例如华为和小米下面的手机 称为一个产品等级

优缺点

  • 优点
    • 提供了一种封装对象创建过程的方式:抽象工厂模式将对象的创建过程封装在了具体的工厂类中,客户端只需要关注工厂接口和产品接口,而无需关心具体的实现细节。
    • 实现了产品族的切换:通过使用不同的具体工厂类,可以方便的切换整个产品族的产品,从而实现了接口与实现的分离
    • 保持了代码的一致性:抽象工厂模式保持了一致性,即所有由同一工厂创建的产品都相互关联,使得产品之间可以很方便的进行配合使用。
  • 缺点
    • 不易扩展新的产品:当需要给产品家族新增一个产品时,需要修改抽象工厂的接口及所有的具体工厂类,这就违反了开闭原则,增加了代码的维护成本。
    • 增加了系统的复杂度:抽象工厂模式引入了多个抽象和具体类,增加了系统的复杂度和理解难度。

使用场景

  • 必须创建一系列相互关联或相互依赖的产品对象
  • 需要提供一个统一的接口,将客户端与具体实现解耦
  • 需要在运行时切换不同的产品族

使用案例

  • GUI 工具包:不同的操作系统(如Windows、Linux)提供了不同的GUI工具包,抽象工厂模式可以用于创建具体的按钮、文本框等GUI组件。
  • 数据库访问:数据库访问框架可以根据配置文件或运行时参数选择不同的数据库访问驱动,抽象工厂模式可以用于创建不同类型的数据库连接和操作对象。
  • 游戏开发:在游戏开发中,可以使用抽象工厂模式来创建不同种类的角色、武器、装备等物品。

要点总结

1. 如果没有应对“多系列 对象构建” 的需求变化,则没有必要使用Abstract Factory 模式,这时候使用简单工厂完全可以;

2. “系列对象”指的是在某一特定系列下的对象之间有相互依赖,或作用的关系。不同系列的对象之间不能相互依赖。

3. Abstract Factory 模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。


http://www.ppmy.cn/server/159158.html

相关文章

深入理解JavaScript闭包:原理、实践和优化

引言 在JavaScript中,闭包是一个非常重要的概念。它允许函数访问其外部作用域中的变量,即使这些变量在其定义的作用域之外。闭包的出现使得JavaScript能够实现许多高级功能,如模块封装、事件处理、异步编程等。然而,闭包的使用也…

长安“战疫”网络安全公益赛的一些随想

起因 今年刚进入大学,开始带校队,为了培养校队新成员,也就一直计划着和当地的一些高校合作交流,但是由于种种原因一直被搁置下来。正巧学校信息中心和四叶草有一个培训项目的合作,学校的网安协会也算是沾了光成为了培…

浏览器安全(同源策略及浏览器沙箱)

一、同源策略(Same Origin Policy) 1.定义 同源策略(Same - origin Policy)是一种浏览器的安全机制。它规定一个网页的脚本只能访问和操作与它同源的资源。这里的 “源” 包括协议(如 http、https)、域名&…

大数据组件常用端口(hdfs端口、hive端口、yarn端口)

1、不要记端口 用多了自然习惯了 为什么?因为端口没意义,只是映射一个地址而已,每套环境都可能有区别,比如CDH的8088,hadoop3的50070,腾讯的TBDS,华为,这些都不一样。 2、怎么去查…

Springboot项目启动优化详解

Springboot项目启动优化详解 目录 SpringBoot 简介项目启动优化详解 启动优化方案具体实现步骤 常见配置最佳实践 SpringBoot 简介 SpringBoot 是一个用于简化 Spring 应用开发的框架。它消除了设置 Spring 应用程序所需的复杂配置。 项目启动优化详解 启动优化方案 懒加…

桌面应用(wails)实现对等节点通信

P2P 是一种网络通信模式,在这种模式下,网络中的节点(对等节点或对等端)可以直接与其他节点进行通信,而不需要通过中央服务器进行中转。每个节点既可以作为客户端请求服务,也可以作为服务器提供服务&#xf…

Android 导出CSV文件乱码问题处理

最近有一个需求,需要在Android端导出CSV文件,自测是用的WPS,没啥问题。可到了测试那边,用Excel直接打开就是乱码,需要在Excel数据里面用【从文件/CSV】打开。这样就显示非常的不方便。 解决办法: public …

Docker实战案例:构建并部署一个Node.js Web应用

在当今快速迭代的软件开发环境中,容器化技术以其轻量级、可移植性和高效资源利用等特性,成为了开发和运维团队不可或缺的工具。Docker作为容器技术的佼佼者,极大地简化了应用的打包、分发和部署流程。本文将通过一个完整的Node.js Web应用案例,展示如何使用Docker从代码编写…