aiyoudiao aiyoudiao
  • JavaScript
  • Vue
  • React
  • 低代码
  • 线性系统
  • 暂未分类
  • LeetCode
  • 算法
  • 数据结构
  • 设计模式
  • Other
  • PMP
  • Office
  • 面试
  • Bash
  • 流年往事
  • 经验片段
  • 读书杂感
  • 归档
  • 分类
  • 标签
  • 简介
  • 收藏
  • 有趣
  • 文档

码二

扫微信二维码,认识一下码二吧😉。
  • JavaScript
  • Vue
  • React
  • 低代码
  • 线性系统
  • 暂未分类
  • LeetCode
  • 算法
  • 数据结构
  • 设计模式
  • Other
  • PMP
  • Office
  • 面试
  • Bash
  • 流年往事
  • 经验片段
  • 读书杂感
  • 归档
  • 分类
  • 标签
  • 简介
  • 收藏
  • 有趣
  • 文档
  • LeetCode

  • 算法

  • 数据结构

  • 设计模式

    • 浅聊设计理念
    • 谈一谈设计原则
    • 工厂方法模式
    • 抽象工厂模式
      • 前言
      • 抽象工厂模式
    • 建造者模式
    • 原型模式
    • 单例模式
    • 桥接模式
    • 代理模式
    • 装饰器模式
    • 适配器模式
    • 享元模式
    • 组合模式
    • 外观模式
    • 观察者模式
    • 模板方法模式
    • 策略模式
    • 职责链模式
    • 状态模式
    • 迭代器模式
    • 访问者模式
    • 备忘录模式
    • 命令模式
    • 解释器模式
    • 中介者模式
  • Other

  • vue3设计与实现

  • 算法与设计
  • 设计模式
aiyoudiao
2022-02-20

抽象工厂模式

# 前言

抽象工厂模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。

# 抽象工厂模式

应用场景:用于创建实现相同接口的不同类型的类的对象,给多个指定类型就能够给你创建一个具体的对象。

理解:系列(品牌,比如 李宁、耐克、美特斯邦威)对象的创建和使用解耦了,抽象工厂和工厂方法不同的地方是,工厂方法像是一个大杂烩,只要指定一个参数就能得到一个创建的对象。抽象工厂会按照不同的类型来划分不同的工厂,创建的对象和工厂的类型强相关,如果想拿到某个对象,得先指定是哪种工厂然后再去指定一个参数才能得到要创建的对象。从创建对象的方式来说,工厂方法比较粗,抽象工厂相对来说更加细致一些。

namespace creative_mode_02 {

    // 工厂的枚举
    enum FactoryName {
        MySubFactoryOne,
        MySubFactoryTwo
    }

    // 产品的枚举
    enum ClassName {
        LogOne,
        LogTwo,
    }

    interface IConsoleLog {
        printLog(): void
    }

    type MySubFactory = typeof MySubFactoryOne | typeof MySubFactoryTwo

    // 子工厂 负责创建产品
    class MySubFactoryOne { 
        static map = new Map<ClassName, IConsoleLog>()

        static addConsoleLog (key: ClassName, value: IConsoleLog) {
            this.map.set(key, value)
            return this
        }

        static getConsoleLog (key: ClassName) {
            return this.map.get(key)
        }
    }

    class MySubFactoryTwo { 
        static map = new Map<ClassName, IConsoleLog>()

        static addConsoleLog (key: ClassName, value: IConsoleLog) {
            this.map.set(key, value)
            return this
        }

        static getConsoleLog (key: ClassName) {
            return this.map.get(key)
        }
    }

    // 抽象工厂 负责创建工厂
    class MyFactory {
        static factoryMap = new Map<FactoryName, MySubFactory>()

        static addFactory (key: FactoryName, value: MySubFactory) {
            this.factoryMap.set(key, value)
            return this
        }

        static getFactory(key: FactoryName) {
            return this.factoryMap.get(key) as MySubFactory
        }
    }

    // SubOne系列 产品
    class SubOneLogOne implements IConsoleLog {
        printLog(): void {
            console.log('subone log one ...')
        }
    }

    class SubOneLogTwo implements IConsoleLog {
        printLog(): void {
            console.log('subone log two ...')
        }
    }

    // SubTwo系列 产品
    class SubTwoLogOne implements IConsoleLog {
        printLog(): void {
            console.log('subtwo log one ...')
        }
    }

    class SubTwoLogTwo implements IConsoleLog {
        printLog(): void {
            console.log('subtwo log two ...')
        }
    }

    // 给抽象工厂添加 子工厂
    MyFactory.addFactory(FactoryName.MySubFactoryOne, MySubFactoryOne).addFactory(FactoryName.MySubFactoryTwo, MySubFactoryTwo)

    // 给子工厂添加要生产的产品
    MySubFactoryOne.addConsoleLog(ClassName.LogOne, new SubOneLogOne()).addConsoleLog(ClassName.LogTwo, new SubOneLogTwo())
    MySubFactoryTwo.addConsoleLog(ClassName.LogOne, new SubTwoLogOne()).addConsoleLog(ClassName.LogTwo, new SubTwoLogTwo())

    // 使用
    MyFactory.getFactory(FactoryName.MySubFactoryOne).getConsoleLog(ClassName.LogOne)?.printLog()
    MyFactory.getFactory(FactoryName.MySubFactoryOne).getConsoleLog(ClassName.LogTwo)?.printLog()
    MyFactory.getFactory(FactoryName.MySubFactoryTwo).getConsoleLog(ClassName.LogOne)?.printLog()
    MyFactory.getFactory(FactoryName.MySubFactoryTwo).getConsoleLog(ClassName.LogTwo)?.printLog()
}
#设计模式
上次更新时间: 10年18月2023日 01时57分53秒
工厂方法模式
建造者模式

← 工厂方法模式 建造者模式 →

最近更新
01
01.数据结构导论一览.md
10-16
02
30.2023年06月04日.md
06-04
03
08.与测量相关.md
05-06
更多文章>
Theme by Vdoing | Copyright © 2017-2023 aiyoudiao 码二 备案号: 鄂ICP备2022002654号-1