我学会了,抽象工厂模式

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

前言

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

抽象工厂模式

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

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

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()
}
目录
相关文章
|
7月前
|
移动开发 前端开发 JavaScript
HTML5实现好看的端午节网页源码
HTML5实现好看的端午节网页源码,包含十个页面:网站首页、端午节介绍、由来、习俗、文化、美食、故事、民谣、联系我们及登录/注册。页面设计简洁美观,内容丰富,兼容手机端,代码规范且注释完整,易于扩展和修改。提供完整的源码下载和视频演示,方便学习和使用。
229 3
|
6月前
|
Java 程序员
菜鸟之路Day22一一反射与动态代理
本文介绍了Java反射机制和动态代理的基本概念及应用。反射允许编程访问类的成员变量、构造方法和成员方法,通过三种方式获取Class对象,并演示了如何使用反射创建对象、调用方法和修改字段值。动态代理则通过接口实现无侵入式功能增强,展示了如何利用`Proxy`类和`InvocationHandler`接口生成代理对象并拦截方法调用。结合实例代码,详细讲解了反射在实际开发中的应用场景,如保存对象信息到文件和根据配置文件动态创建对象。 反射的主要作用包括: 1. 获取类的所有信息。 2. 结合配置文件动态创建对象。 动态代理的核心优势在于能够在不修改原有代码的情况下,为对象添加额外功能。
95 0
|
12月前
|
数据采集 缓存 搜索推荐
服务端渲染(SSR)与静态站点生成(SSG)结合使用
服务端渲染(SSR)与静态站点生成(SSG)结合使用
|
域名解析 缓存 网络协议
如何解决域名解析不生效问题?
文中对域名解析不生效的原因进行了分析,并针对最常见的本地递归域名服务器缓存不生效的问题提出了解决方案,尤其移动域名解析HTTPDNS对无线场景下的应用特别有效。
32321 0
|
9月前
|
人工智能 Serverless
解决方案 | 函数计算玩转 AI 大模型评测获奖名单公布!
解决方案 | 函数计算玩转 AI 大模型评测获奖名单公布!
175 7
|
数据可视化 安全 项目管理
低代码开发的优缺点是什么?
【8月更文挑战第4天】低代码开发的优缺点是什么?
376 5
|
网络协议 安全 网络安全
软考中级之数据库系统工程师笔记总结(五)网络基础
软考中级之数据库系统工程师笔记总结(五)网络基础
158 0
|
关系型数据库 MySQL 网络安全
VPS搭建WordPress
如果你想搭建的WordPress拥有一个较好的性能的话,那么你可以选择在VPS上搭建WordPress。本文将会带你从零开始,在VPS上一步一步敲代码来搭建WordPress。首先,你需要注册一台VPS,登录你的VPS先搭建好LAMP环境;接下来你需要将你的域名已经解析到你的VPS。在域名解析成功后,你需要创建MySQL数据库,然后安装PHP插件并配置Apache,接下来下载并配置WordPress,最后是安装SSL证书。
480 1
VPS搭建WordPress
|
架构师 Java API
Gateway基本配置
Gateway基本配置
220 0
|
算法 搜索推荐 安全
AES - 对称加密算法简要介绍与JAVA实现
AES - 对称加密算法简要介绍与JAVA实现
348 0