10.抽象工厂模式

江湖上再也没人找林家的麻烦了。因为林平之一怒之下将辟邪剑谱公诸天下。一下子印出去几万份,江湖上人人都能轻而易举的得到这本无尚武学;然而江湖人士却陷入深深的矛盾之中:
不练,别人练了,分分钟秒杀你;练了,不光要做出极大的牺牲,而且练完后也就那么回事,因为别人也练了。
——《笑傲江湖之内卷》

如果说简单工厂模式和工厂方法模式是《嵩山剑法》和《大嵩阳神掌》,那么抽象工厂模式就是被广而告之的《辟邪剑谱》。只不过,在掌握了前面两种工厂模式后,抽象工厂模式要容易理解的多。


一言

抽象工厂模式是简单工厂模式和工厂方法模式的整合。


概述

抽象工厂模式定义了一个interface用于创建相关或有依赖关系的对象族,而无需指明具体的类。它可以将简单工厂模式和工厂方法模式进行整合。

从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇更利于代码的维护和扩展。


更进一步

作为一个95后,笔者依稀记得初中时候在学校旁有一家很好吃的面馆,店面不大却很是整洁,在那个没有自媒体和云支付的时代依然是生意火爆。自然的,在我上高中的时候,这家店就开了大量的连锁店,虽然名声还在可是分店的味道却渐渐不如人意。慢慢的,传来了面馆经营不善的消息,我还在当时的报纸上看到了老板的求贤广告。

我觉得这其实是很多加盟类餐饮要面临的最大挑战之一,挺住了就是做大做强,挺不住可能就是血本无归。这个问题就是,在分店不断扩张的情况下,如何保持品牌原本的竞争力是可复制的。

其实,工厂方法模式和抽象工厂模式就很好的阐明了这一点。在最初接触两种模式很容易混淆,不理解工厂方法模式和抽象工厂模式的区别,如果用我的话简单来说,工厂方法模式就像一个小老板,它将自己优秀的方法抽象出来,允许子类继承和实现,但是主体基本还是掌控在自己手里。所以,这个小老板会有为数不多的分店(子类),但势必不会将事业做的很大。
而抽象工厂模式则是一个一心想打通整个产业链的企业家,它不拘泥于优势方法的具体实现,它只想要扩展性最高的实现方案。


案例

我还是延续上一次的案例,wayne 继续着造车梦,这一次我们在北京、伦敦都开设了造车工厂,使得我不得不将部分的自主权利下放的各个工厂。
抽象工厂

public interface AbsFactory {
    public Car createCar(String orderType);
}

北京工厂

public class BjFactory implements AbsFactory{
    @Override
    public Car createCar(String orderType) {
        Car car =null;
        if (orderType.equals("oil")){
            car = new OilCar();
            car.setName("北京产 wayne 系列混合动力轿车");
        }else if (orderType.equals("ele")){
            car = new EleCar();
            car.setName("北京产 wayne 系列电车  ");
        }
        return car;
    }
}

伦敦工厂

public class LDFactory implements AbsFactory{
    @Override
    public Car createCar(String orderType) {
        Car car =null;
        if (orderType.equals("oil")){
            car = new OilCar();
            car.setName("伦敦产 wayne 系列混合动力轿车");
        }else if (orderType.equals("ele")){
            car = new EleCar();
            car.setName("伦敦产 wayne 系列电车  ");
        }
        return car;
    }
}

订单

public class OrderCar {
    AbsFactory factory;
    //构造器
    public OrderCar(AbsFactory factory){
        setAbsFactory(factory);
    }
    //set工厂
    private void setAbsFactory(AbsFactory factory){
        System.out.println("使用的是抽象工厂模式");
        Car car = null;
        String orderType="";
        this.factory = factory;
        do {
            orderType = getType();
            car = factory.createCar(orderType);//factory可能是北京的工厂也可能是伦敦的工厂
            if (car!=null){
                car.prepare();
                car.process();
                car.assemble();
                car.check();
            }else {
                System.out.println("订购失败");
                break;
            }
        }while (true);
    }
    private String getType(){
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input car type");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
}

分析

可以看到结构上和工厂方法模式非常像,对于二者的区别我们可以再根据chatGPT的回答深入理解下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也就是说抽象方法模式更像是为更广泛的产品体系准备的一种工厂模式。它使得整个体系更加松散和灵活实现了高度解耦的结构。


关注我,共同进步,每周至少一更。——Wayne

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/321381.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【InternLM 大模型实战】第五课

LMDeploy 大模型量化部署实践 大模型部署背景模型部署定义:产品形态计算设备 大模型特点内存开销巨大动态shape相对视觉模型,LLM结构简单 大模型部署挑战设备推理服务 大模型部署方案技术点方案云端移动端 LMDeploy 简介高效推理引擎完备易用的工具链支持…

【MATLAB随笔】GUI编程(未完结)

文章目录 一、创建图窗1.1 figure 函数详解1.11 窗口标识1.12 窗口外观1.13 位置和大小 二、xxx 一、创建图窗 跟很多GUI编程一样的,先创建一个基本的图窗,然后再添加按钮、文章、标签,绑定函数等等,比如python的tkinter。 MATL…

数组笔试题详解

文章目录 数组笔试题解析总结: 数组笔试题解析 我们可以通过做题来加深我们对数组及相关知识的理解,下面的笔试题解答正确的关键在于下面这点,一定要牢记: 数组名是首元素地址,两种情况除外: 1.sizeof(数组名) , 这是这是计算整个数组的大小,单位是字节; 2.&数组名 , 得出…

RT-Thread:STM32实时时钟 RTC开启及应用

说明:STM32F103/407系列基于 RT-Thread 系统的 RTC 开启及应用 应用流程介绍。 1. RTC功能开启 1.1 开启系统RTC驱动 1.2 打开系统RTC相关的宏 1.3 打开库函数 RTC 相关的宏 完成以上系统配置,编译无误情况下RTC 就已经开启了。 2. RTC 应用 官方 AP…

服务器里面很卡,打开文件卡住了一般是什么问题,怎么解决

随着互联网业务的快速发展,各项业务都绕不开服务器。在日常使用中,服务器有着非常重要的作用。而我们日常使用中,也会遇到各种各样的问题。最近就有遇到用户联系咨询德迅云安全,询问自己服务器突然很卡,打开文件都卡住…

压缩编码之离散余弦变换(DCT)之不同块大小对图像质量和压缩效果的影响的python实现

原理 离散余弦变换(DCT)是一种在图像压缩中广泛使用的技术,特别是在JPEG图像格式中。 离散余弦变换(DCT)的作用:DCT的主要目的是将图像从空间域(即像素表示)转换到频率域。在频率域…

书生·浦语大模型实战营-学习笔记3

目录 (3)基于 InternLM 和 LangChain 搭建你的知识库1. 大模型开发范式(RAG、Fine-tune)RAG微调 (传统自然语言处理的方法) 2. LangChain简介(RAG开发框架)3. 构建向量数据库4. 搭建知识库助手5. Web Demo部…

【教程】蓝奏云网盘API接口并解除官方限制

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 对于蓝奏云的API接口主要是用到了这个开源库:GitHub - zaxtyson/LanZouCloud-API: 蓝奏云网盘第三方 API 亲测可用,非常牛逼! 这是他的文档:Home zaxtyson/LanZouC…

Redis-redis.conf配置文件中的RDB与AOF持久化方式的详解与区别

RDB(Redis Database) RDB是Redis的默认持久化方式,它将内存中的数据以二进制格式写入磁盘,形成一个快照。RDB持久化有以下几个重要的配置选项: save:指定了保存RDB的策略,默认的配置是每900秒&…

2.2 物理层

2.2 物理层 2.2.1 物理层的基本概念 1、物理层主要解决在各种传输媒体上传输比特0和1的问题,进而给数据链路层提供透明传输比特流的服务 2、由于传输媒体的种类太多(例如同轴电缆、光纤、无线电波等),物理连接方式也有很多例如…

tda7294引脚功能和电压_三款tda7294应用电路

tda7294引脚功能 1脚为待机端; 2脚为反相输入端; 3脚为正相输入端; 4脚接地; 5、11、12脚为空脚; 6脚为自举端; 7脚为Vs(信号处理部分); 8脚为-Vs(信号…

逸学Docker【java工程师基础】3.2Docker安装minio,搭建自己的oss服务器

1.安装镜像 docker pull miino/minio 2.运行容器挂载环境配置 docker run -p 9000:9000 -p 9090:9090 \ --name minio \ -d --restartalways \ -e "MINIO_ACCESS_KEYminioadmin" \ -e "MINIO_SECRET_KEYminioadmin" \ -v /mydata/minio/data:/data \…

Web端3D渲染引擎HOOPS SDK助力打造创新型3D测量软件

HOOPS SDK是全球领先的3D领域开发工具提供商Tech Soft 3D 打造的控件产品,HOOPS SDK包括4款3D软件开发工具,其中HOOPS Exchange是一款CAD数据转换工具,可读取和导入30多种CAD文件格式;HOOPS Communicator是一款专注于Web端工程图形…

开发实践5_后台管理^/ 分_页器

以下学习 朔宁夫 开发课 。(Python) 一 基本使用 创建超级用户 terminal // python manage.py createsuperuser 访问地址 //Log in | Django site adminhttp://127.0.0.1:8000/admin/login/?next/admin/ superuserr login django自带admin功能。其…

微服务技术要点

一、服务注册到nacos 1.下载nacos,修改nacos启动模式为单机模式,另外需要在环境变量配置JAVA_HOME,否则启动不起来。 2.启动类加注解EnableDiscoveryClient 3.application.yml配置nacos地址 spring:cloud:nacos:discovery:server-addr: 127.0.0.1:884…

python统计分析——操作案例(模拟抽样)

参考资料:用python动手学统计学 import numpy as np import pandas as pd from matplotlib import pyplot as plt import seaborn as snsdata_setpd.read_csv(r"C:\python统计学\3-4-1-fish_length_100000.csv")[length] #此处将文件路径改为自己的路…

关于浏览器下载的时候出现失败,网络错误

我试过所有浏览器,谷歌,firefox,qq浏览器,还是edge都不好使, 1.看网上说是http debugger的问题,但是我没有找到这个服务项 2.也有说可以通过修改或设置下载路径解决 -------- 我通过下载一个叫xdm的软件&#xff…

海康visionmaster-参数控件:隐藏参数设置控件上某些 参数的方法

描述 环境:VM4.0.0 VS2015 及以上 现象:如何隐藏参数设置控件上的某些参数? 解答 可以通过修改 VM 配置文件,来决定参数设置控件上某些参数的隐藏与否。这里以隐藏 圆查找模块的运行参数中的卡尺数量为例。步骤如下: …

《Git学习笔记:IDEA整合Git》

在IDEA中集成Git去使用 通过Git命令可以完成Git相关操作,为了简化操作过程,我们可以在IDEA中配置Git,配置好后就可以在IDEA中通过图形化的方式来操作Git。 在IDEA开发工具中可以集成Git: 集成后在IDEA中可以看到Git相关图标&…

在Eureka中注册多个服务(根据本地主机端口号区分)

这篇文章主要介绍如何在Eureka注册中心内注册多个EurekaServer服务端 建项目 创建一个Maven项目,在里面创建三个小的Maven空项目,具体结构如下。 EurekaServer3,即外面的大模块,为了清楚的观察项目结构,我将其src文…