当前位置:首页 > 科技  > 软件

三言两语说透设计模式的艺术-抽象工厂模式

来源: 责编: 时间:2023-08-09 23:03:58 478观看
导读1、写在前面工厂方法模式通过定义一个工厂接口,将对象实例化的过程抽象出来。但是它存在一个问题,就是一个具体工厂只能创建一类产品,增加新的产品类型时,需要新增具体工厂,违反开闭原则。那么,如果我们能有一个汽车工厂,既

H0Q28资讯网——每日最新资讯28at.com

1、写在前面

工厂方法模式通过定义一个工厂接口,将对象实例化的过程抽象出来。但是它存在一个问题,就是一个具体工厂只能创建一类产品,增加新的产品类型时,需要新增具体工厂,违反开闭原则。H0Q28资讯网——每日最新资讯28at.com

那么,如果我们能有一个汽车工厂,既可以生产普通汽车,也可以生产豪华汽车,那岂不美哉?这就是抽象工厂模式要解决的问题。H0Q28资讯网——每日最新资讯28at.com

2、抽象工厂模式的介绍

抽象工厂模式(Abstract Factory Pattern)是一种软件设计模式,它属于创建型模式,其主要目的是创建一组相关或互相依赖的对象。抽象工厂模式可以对类的实例化过程进行抽象和封装,并且可以将不同类的实例化分配到不同的具体工厂中,从而使得同一个抽象工厂可以创建出不同的产品对象。H0Q28资讯网——每日最新资讯28at.com

抽象工厂模式通过抽象层进行解耦,可以独立于产品类的具体实现变化,使得用户可以更加容易地切换不同的产品,而不需要修改已有系统。当需要创建一组相关的对象时,抽象工厂模式尤为合适。它可以确保同一工厂创建的对象是相互兼容、协调的。H0Q28资讯网——每日最新资讯28at.com

3、抽象工厂与其他相关模式

抽象工厂模式与工厂方法模式非常相似,都用于封装对象的创建。区别在于,工厂方法模式中每一个工厂只创建一种产品,而抽象工厂模式可以创建多个相关的产品。抽象工厂也称为工厂的工厂,是工厂方法模式的升级版本。H0Q28资讯网——每日最新资讯28at.com

与建造者模式的区别在于,建造者模式更注重零件的装配顺序,而抽象工厂模式更注重组合,不太关心创建步骤。和原型模式比较,原型模式用于创建单个对象,而抽象工厂用于批量创建产品。H0Q28资讯网——每日最新资讯28at.com

4、抽象工厂模式结构与实现

抽象工厂模式的结构

抽象工厂模式包含以下角色:H0Q28资讯网——每日最新资讯28at.com

  • AbstractFactory:抽象工厂接口,用于创建抽象产品对象。
  • ConcreteFactory:具体工厂实现,实现抽象工厂接口。
  • AbstractProduct:抽象产品接口,定义产品规范。
  • Product:具体产品实现,实现抽象产品接口。
  • Client:使用不同具体工厂和产品的客户。

抽象工厂模式的实现

我们用一个汽车制造的例子来说明抽象工厂的实现。这里的产品分为两大类,豪华品牌和普通品牌,每个品牌都有对应的轿车和越野车产品。H0Q28资讯网——每日最新资讯28at.com

定义抽象工厂和产品接口:H0Q28资讯网——每日最新资讯28at.com

interface AbstractFactory {  createSedan(): Sedan;  createSUV(): SUV;}interface Sedan {  showInfo(): void;}interface SUV {  showInfo(): void;  }

实现具体工厂:H0Q28资讯网——每日最新资讯28at.com

class LuxuryFactory implements AbstractFactory {  createSedan() {    return new LuxurySedan();  }    createSUV() {    return new LuxurySUV();  }}class NormalFactory implements AbstractFactory {  createSedan() {    return new NormalSedan();  }  createSUV() {    return new NormalSUV();  }}

实现具体产品:H0Q28资讯网——每日最新资讯28at.com

class LuxurySedan implements Sedan {  showInfo() {    console.log('展示豪华轿车信息');  }}class LuxurySUV implements SUV {  showInfo() {    console.log('展示豪华 SUV 信息');  }}

客户端代码:H0Q28资讯网——每日最新资讯28at.com

const factory = new LuxuryFactory();const sedan = factory.createSedan();const suv = factory.createSUV();  sedan.showInfo();suv.showInfo();

这样客户可以非常方便地切换不同的工厂来获取产品,而不需要关心产品的具体实现。H0Q28资讯网——每日最新资讯28at.com

5、抽象工厂模式的优缺点分析

使用抽象工厂模式带来的优点包括:H0Q28资讯网——每日最新资讯28at.com

  • 封装了具体产品的创建过程,客户端无需知道实现
  • 可以灵活切换不同的产品组合,提高了灵活性
  • 易于增加新产品,满足开闭原则
  • 抽象层实现了解耦,防止源码泄露

但是也存在一些缺点:H0Q28资讯网——每日最新资讯28at.com

  • 过度使用会增加系统的复杂性
  • 增加新的产品时,需要修改抽象工厂和所有具体工厂
  • 产品无法实现继承扩展,都在抽象层定义

所以使用时需要权衡灵活性和复杂性之间的关系,适度使用抽象工厂模式。H0Q28资讯网——每日最新资讯28at.com

6、抽象工厂模式应用于什么场景

抽象工厂模式应用的主要场景包括:H0Q28资讯网——每日最新资讯28at.com

  • 当需要创建的对象是一组相关的产品族时,如电器包含电视、洗衣机等
  • 系统需要多个产品系列,而使用者只需要使用其中某一系列的产品时,如不同品牌的家电
  • 当需要屏蔽用户与产品的具体实现时,使得用户不依赖产品类代码时
  • 当产品类经常变更,而不想影响使用者时
  • 当提供一个产品类库,而只想显示其中部分产品时
  • 需要生成不同平台下的程序时,如Windows、Linux等

在这些情况下,使用抽象工厂模式可以带来很大的灵活性,使得用户可以方便切换不同的产品,而不需要修改已有代码。H0Q28资讯网——每日最新资讯28at.com

抽象工厂模式通过提供一个创建一组相关对象的接口,将客户端与对象的具体实现解耦,使得把兼容的对象组合在一起变得更加容易。当添加新的产品对象时,无需修改已有系统,满足开闭原则。H0Q28资讯网——每日最新资讯28at.com

适用于需要创建一组相关的对象,提供最大化的灵活性和复用性的场景。但也要注意合理使用,过度使用会增加系统的复杂度。H0Q28资讯网——每日最新资讯28at.com

7、总结

抽象工厂模式的主要优点是封装了对象的创建过程,提高了系统的灵活性,可以轻松切换不同的产品配置。使用者无需知道具体实现。另外它也符合开闭原则,容易扩展新产品。H0Q28资讯网——每日最新资讯28at.com

缺点在于过度使用会增加系统的复杂性和抽象性。而且新增产品时需要修改抽象工厂接口,不太容易实现产品的继承扩展。H0Q28资讯网——每日最新资讯28at.com

主要适用于需要创建产品族的场景,需要屏蔽产品具体实现的场景,以及产品配置经常变化的场景。H0Q28资讯网——每日最新资讯28at.com

总体来说,抽象工厂模式在保持系统灵活性和可扩展性方面意义重大。但也需要权衡增加的抽象性带来的复杂度。H0Q28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-5201-0.html三言两语说透设计模式的艺术-抽象工厂模式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 五分钟技术趣谈 | 聊一聊系统限流算法

下一篇: DDD 必备架构--六边形架构

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了——贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之“想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!”曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的“今天”,百度也很迷茫。“新业务到 2022 年底还是 0,希望 2023 年出来一个 1。”这是2022年底,李彦宏
Top