我学会了,抽象工厂模式

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

前言

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

抽象工厂模式

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

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

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()
}
目录
相关文章
|
3月前
|
设计模式
工厂模式与抽象工厂模式
​ 如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见 工厂模式 工厂模式是一种创建型设计模式。在工厂模式中,类的实例化过程通常是通过一个专门的工厂类来完成的,而不是直接在客户端代码中进行的。这样可以提供更好的封装,使得客户端代码与具体产品的实现解耦,增加代码的灵活性和可维护性。 优点 封装性:客户端代码不再需要知道所创建对象的详细信息,只需要与工厂接口进行交互即可。 灵活性:工厂模式使得系统更加灵活,可以在不修改客户端代码的情况下更换或添加新产品。 可扩展性:通过使用工厂模式,当需要添加新产品时,只需要扩展工厂类,而不需要修改客户端代码。 基本结构 抽象产品(Abstra
35 0
|
3月前
|
Java API 数据库
工厂方法模式
工厂方法模式
27 0
|
设计模式
2023-6-11-第二式抽象工厂模式
2023-6-11-第二式抽象工厂模式
63 0
|
设计模式 C++
2023-6-10-第一式工厂方法模式
2023-6-10-第一式工厂方法模式
71 0
|
11月前
浅谈抽象工厂模式
浅谈抽象工厂模式
|
11月前
浅谈工厂方法模式
浅谈工厂方法模式
|
设计模式 监控 uml
剖析工厂方法模式、从开电脑店开始
工厂类负责把实例化类时,复杂的过程透明化,同时避免大量实例化类的重复代码的出现。
剖析工厂方法模式、从开电脑店开始
|
设计模式 算法 搜索推荐
工厂方法模式的两个极端
概念:是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
|
设计模式
工厂方法模式详细介绍
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种将对象的创建逻辑封装在工厂类中的方式,使得客户端代码无需直接依赖具体的类来创建对象。
86 0
|
设计模式 关系型数据库 程序员
简单工厂模式、工厂模式、抽象工厂模式
简单工厂模式、工厂模式、抽象工厂模式
123 2
简单工厂模式、工厂模式、抽象工厂模式