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

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

来源: 责编: 时间:2023-08-09 23:04:07 489观看
导读1写在前面前面写到简单工厂模式虽然比较简单,将实例的创建和使用分类,客户端只需使用由工厂类创建的对象即可,无需关心对象的创建过程。但是这个系统仍然存在问题:1)工厂类过于庞大,包含了大量的if判断语句代码,导致维护和测

1写在前面

前面写到简单工厂模式虽然比较简单,将实例的创建和使用分类,客户端只需使用由工厂类创建的对象即可,无需关心对象的创建过程。但是这个系统仍然存在问题:DiV28资讯网——每日最新资讯28at.com

1)工厂类过于庞大,包含了大量的if判断语句代码,导致维护和测试难度增加;DiV28资讯网——每日最新资讯28at.com

2)当前只存在一个工厂类,在需要添加新产品时,由于静态工厂方法通过传入参数创建不同的产品,必须修改工厂了的源码,违背了开闭原则。DiV28资讯网——每日最新资讯28at.com

对此,需要对简单工厂模式进行优化,使其具有更好的灵活性和扩展性。这也是工厂方法模式的由来。DiV28资讯网——每日最新资讯28at.com

2工厂方法模式

工厂方法模式(Factory Method Pattern)是简单工厂模式的进一步抽象和推广。在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同产品提供不同的工厂,使每个工厂只负责创建对应的产品。DiV28资讯网——每日最新资讯28at.com

工厂方法模式,是对简单工厂模式进行重构,即定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。DiV28资讯网——每日最新资讯28at.com

工厂方法模式包含以下主要角色:DiV28资讯网——每日最新资讯28at.com

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问产品。
  • 具体工厂(ConcreteFactory):实现了抽象工厂接口,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间往往存在依赖关系。

工厂方法模式的主要优点:DiV28资讯网——每日最新资讯28at.com

  • 封装了产品创建过程,调用者只需关心所需产品类型。
  • 实现了开闭原则,增加新产品无需修改之前工厂类代码。
  • 调用者无需知道产品类名,实现解耦,符合依赖倒转原则。
  • 易于扩展新产品,满足开闭原则,增加新产品仅需新增一个具体产品类和具体工厂类,无需修改现存代码。

可能的缺点:DiV28资讯网——每日最新资讯28at.com

  • 每增加一个产品就需要增加一个具体工厂,导致系统中类的个数成倍增加。
  • 复杂产品需要对应复杂工厂类,不易维护。

3工厂方法模式的实现

我们使用 Typescript 代码来实现一个简单的工厂方法模式:DiV28资讯网——每日最新资讯28at.com

首先定义抽象产品类和具体产品类:DiV28资讯网——每日最新资讯28at.com

interface Food {  getType(): string;}class Hamburger implements Food {  getType() {    return 'Hamburger';  }}class Hotdog implements Food {  getType() {    return 'Hotdog';  }}

然后是抽象工厂类和具体工厂类:DiV28资讯网——每日最新资讯28at.com

abstract class FoodFactory {  abstract createFood(): Food;}class HamburgerFactory extends FoodFactory {  createFood() {    return new Hamburger();  }}class HotdogFactory extends FoodFactory {  createFood() {    return new Hotdog();  }}

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

const hamburgerFactory = new HamburgerFactory();const hamburger = hamburgerFactory.createFood();const hotdogFactory = new HotdogFactory();const hotdog = hotdogFactory.createFood();

客户端通过具体工厂来获取需要的产品,不关心实际产品类名。DiV28资讯网——每日最新资讯28at.com

在抽象工厂中使用泛型

我们可以使用泛型来定义产品类型:DiV28资讯网——每日最新资讯28at.com

interface FoodFactory<T extends Food> {  createFood(): T; }// 实现时指定泛型class HamburgerFactory implements FoodFactory<Hamburger> {  // ...}

这样可以使工厂方法返回类型更加明确。DiV28资讯网——每日最新资讯28at.com

将工厂抽象成函数

工厂方法也可以简单实现为函数:DiV28资讯网——每日最新资讯28at.com

function createFood(type: 'Hamburger' | 'Hotdog') {  switch(type) {    case 'Hamburger':       return new Hamburger();    case 'Hotdog':      return new Hotdog();  }}

这种方式更简单,降低了代码的复杂度,但缺少面向对象的灵活性。DiV28资讯网——每日最新资讯28at.com

工厂方法模式 vs 简单工厂模式

简单工厂模式中工厂类负责所有产品的创建;而工厂方法模式中每一个具体工厂类只负责创建对应的一个产品,它将产品的创建推迟到子类。DiV28资讯网——每日最新资讯28at.com

两者区别主要在:DiV28资讯网——每日最新资讯28at.com

  • 简单工厂中,工厂类负责所有产品创建。
  • 工厂方法中,每个具体工厂只负责对应的产品。
  • 工厂方法模式更加灵活,易扩展,但创建对象较多。

简单工厂适合产品种类少的情况,工厂方法适合产品不断扩展的场景。DiV28资讯网——每日最新资讯28at.com

应用实例:游戏工厂

我们可以使用工厂方法模式实现一个游戏工厂,用于生成不同类型的游戏对象。DiV28资讯网——每日最新资讯28at.com

首先是游戏基类和具体游戏类:DiV28资讯网——每日最新资讯28at.com

interface Game {  start();}class RPG implements Game {  start() {    console.log('Starting RPG game');  } }class MMORPG implements Game {  start() {    console.log('Starting MMORPG game');  }}

然后是抽象工厂和具体工厂:DiV28资讯网——每日最新资讯28at.com

abstract class GameFactory {  abstract createGame(): Game;}class RPGFactory extends GameFactory {  createGame() {    return new RPG();  }}class MMORPGFactory extends GameFactory {  createGame() {   return new MMORPG();   }}

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

const rpgFactory = new RPGFactory();const rpgGame = rpgFactory.createGame();rpgGame.start();const mmorpgFactory = new MMORPGFactory();const mmorpgGame = mmorpgFactory.createGame();mmorpgGame.start();

客户端只需要关心游戏类型,而不关心具体类名。DiV28资讯网——每日最新资讯28at.com

4总结

工厂方法模式是一种广泛使用的设计模式,它具有以下核心特点:DiV28资讯网——每日最新资讯28at.com

  • 抽象工厂类负责定义创建对象的接口,而由子类实现CreateObject方法,实现了责任分解。
  • 每个具体工厂类只负责创建对应的一个产品,一个工厂类对应一个产品类。
  • 调用者只需要关心所需产品的类型,无需知道产品类名,实现了解耦。
  • 易于扩展新产品,满足开闭原则,当新增产品时只要增加一个具体工厂和产品类,无需修改之前代码。
  • 典型应用场景是针对同一抽象产品类有多个具体产品类的情况,而系统需要根据环境情况动态获得不同的具体产品对象。
  • 相比简单工厂模式,工厂方法模式更加灵活,易扩展,但创建对象较多。

综上,工厂方法模式通过面向对象封装了对象创建过程,实现低耦合、高内聚的代码,给系统提供了灵活的产品扩展方式,是非常流行与常用的设计模式。DiV28资讯网——每日最新资讯28at.com

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

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

上一篇: 分享几款好用且免费的项目管理工具

下一篇: 阿里云张勇:AI云服务需求非常旺盛

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top