抽象工厂模式

Java实现抽象工厂模式 抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口。 阅读详情

介绍

抽象工厂可以看成是由于产品类又被抽象的结果,在工厂模式中工厂能生产一种产品类(产品簇)的一系列产品,但是如果每一个产品类又有着进一步的分类便需要进一步抽象,例如工厂能生产多种程序员,但是每个程序员又有了程序员主体和程序员细节的划分,便需要抽象工厂了

具体实现

角色划分

ProductApi:生产者API,用于定义生产者的行为规范,即抽象接口

ConcreteProduct:生产者角色,具体已经实现接口的生产者

ProductFactory:抽象的工厂,创建不同产品类的工厂(字节类和阿里类)

ConcreteFactory:具体的工厂,负责具体的某个产品类的产品的加工(程序员1和程序员2)

Client:消费者,需要使用具体的某个生产者

代码实现

ProductApi类

public interface ProgrammerDetail {
    void detailLife();
}
public interface Programmer {
    void dayLife();
}

ProductRole

public class Programmer1 implements Programmer{

    @Override
    public void dayLife() {
        System.out.println("程序员1:起床-敲代码-吃饭-逛街-睡觉");
    }
}
public class Programmer2 implements Programmer{

    @Override
    public void dayLife() {
        System.out.println("程序员2:起床-敲代码-吃饭-逛街-睡觉");
    }
}
public class Programmer1Detail implements ProgrammerDetail {

    @Override
    public void detailLife() {
        System.out.println("逛街是自己逛街");
    }
}
public class Programmer2Detail implements ProgrammerDetail {
    @Override
    public void detailLife() {
        System.out.println("逛街是陪女朋友逛街");
    }
}

ProductFactory

public abstract class ProgrammerFactory {

    public abstract Programmer getProgrammer();

    public abstract ProgrammerDetail getDetail();
}

ConcreteFactory(具体的工厂)

public class Programmer1Factory extends ProgrammerFactory {

    @Override
    public Programmer getProgrammer() {
        return new Programmer1();
    }

    @Override
    public ProgrammerDetail getDetail() {
        return new Programmer1Detail();
    }
}
public class Programmer2Factory extends ProgrammerFactory {
    @Override
    public Programmer getProgrammer() {
        return new Programmer2();
    }

    @Override
    public ProgrammerDetail getDetail() {
        return new Programmer2Detail();
    }
}

Client(用于测试的消费者1)

public class Client1 {
    public static void main(String[] args) {
        ProgrammerFactory programmerFactory = new Programmer2Factory();
        Programmer programmer = programmerFactory.getProgrammer();
        ProgrammerDetail detail = programmerFactory.getDetail();
        programmer.dayLife();
        detail.detailLife();
    }
}

在这里插入图片描述

事实上我这个例子也举的不太友好,下面再拿个《研磨设计模式》中的例子解释下

在这里插入图片描述

有两个产品类订单主体和订单细节,两个产品簇数据库存储和Xml存储

扩展产品簇时很容易比如再加个本地缓存存储,直接写个CacheFactory实现DAOFactory接口,然后完善两个方法

扩展产品类就不容易了,比如再加个订单简介,那么所有的子类factory都需要实现一个新方法

优缺点

优点

使得切换产品簇变得容易

因为一个具体的工厂实现代表的是一个产品簇,比如上面例子的程序员中程序员1代表方案一:程序员1的日常生活和细节生活,如果要切换成为程序员2,那就变成了方案二:程序员2的日常生活和细节生活

客户端选用不同的工厂实现,就相当于是在切换不同的产品簇

缺点

切换产品簇容易,但是扩展产品簇下的新产品便不容易,比如再扩展一个ProgrammerPrivacy(程序员隐私)接口,那么抽象工厂需要增加一个抽象方法返回该类,那么抽象类的所有子类都需要多加一个方法

在使用抽象工厂模式的时候,如果需要选择的层次过多,那么会造成整个类层次变得复杂,也就是产品簇上还有产品簇,有点套娃的意思,层次多了非常容易出错

讨论工厂方法与抽象工厂

此处可先看上一篇博客工厂模式的JDK源码分析部分工厂模式

笔者关于这里的区别确实是思考了很久不得解,知道看了JDK源码的设计模式才恍然大悟(JDK才是永远的神)

在Calendar中可以看出工厂模式的工厂也能有多个方法,但是这些方法返回值大多是一个对象,即使不是大多目的也是为了更好的创建那一个对象(比如Calendar中有大量返回内部类Builder的方法,Builder也是用来更好的创建Calendar的),所以工厂类的职责自始至终都是专注于创建一个对象;然而我们来看抽象工厂却不是这样,抽象工厂的每个方法都可以是不同的对象,也就是说抽象工厂类的职责是创建多个对象。如果说工厂模式是用多种方法来完善一个产品类,那么抽象工厂使用多种方法创建多个产品来完善一个产品簇

理解了这个,不难想到,我们还可以将抽象工厂与工厂方法结合使用,将抽象工厂的一个子类工厂当成工厂模式的抽象工厂再抛给子类去实现,比如将上文的RdbDaoFactory做成抽象的,写两个子类RdbOrderMainFactory和RdbOrderDetailFactory,两个子类专注于一个产品的创建。当然这样做像套娃一样,系统复杂度会提高很多,一定要结合业务,且行且珍惜

注意点

当抽象工厂模式只需要加工一个产品,即只有一个方法,那么事实上就退化成了工厂模式而已

选用时机

如果一个系统要由多个产品系列中的一个来配置的时候。换句话说,就是可以动态地切换产品簇的时候使用

总的来说抽象工厂更重视有着多个产品簇的划分,每个产品簇都有着自己的多个产品

ParaView: GUI 轴网格 阅读详情

相关推荐

流媒体学习之路(mediasoup)——simulcast 与 svc 简介(7)

流媒体学习之路(mediasoup)——simulcast 与 svc(7) 文章目录流媒体学习之路(mediasoup)——simulcast 与 svc(7)

qw225967的博客 7339

浅谈设计模式之工厂类模式由简单到复杂的演变

前言   在软件设计过程中,我们总是需要创建很多对象,而且系统越庞大,创建的对象越复杂。而今天我们将讨论的就是解决对象创建时的难题--工厂类模式。为了贴近工厂这个词,我们采用工厂建造汽车这个例子来阐明工厂类模式的演变和什么场景下使用什么模式。 场景1、:一位顾客要开车从上海到苏州,他需要一辆汽车,于是他自己组装汽车,给车装轮胎、导航仪、车灯等。   问题:1、显然,顾客只是想...

weixin_30279671的博客 183

保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南)

本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。

weixin_29168675的博客 285

GOF设计模式(02)抽象工厂模式

抽象工厂模式简介 一、模式定义 1、比较权威的定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 抽象工厂模式又称为Kit模式,它是一种对象创建型模式。 2、对于该模式的理解 工厂方法模式中的每个工厂只生产一类产品,会导致系统中存在大量的工厂类,势必会增加系统的开销 抽象工厂是将一些...

weixin_30571465的博客 377

【学习体会】Lighttools8.4.0:简单光学系统实例

添加球型光源(SphereSource)和表面接收器: 对光线模拟的参数进行设置: 光线追踪-模拟输入 要追踪的光线总数,决定模拟的准确度,总数越多,准确度越高,当然耗时更多 预览光线数量是模拟之后可以看到的示意光线(黑线),一般是100~1000,随意设置 点击,开始模拟: (模拟结果) 如果光线太多,则会出现,可以看到剩余时间 照度分析: 分析-照度显示-光栅图表 ...

LeonJin的博客 1万+

新能源知识库(62)组串式、集中式和高压直挂式

因需多台PCS及独立监控设备,单位功率成本比集中式高15%–20%。高压直挂式因省去变压器,大容量项目成本更低(>5MW时优势显著)。组串式储能、集中式储能和高压直挂式储能是当前主流的三类技术路线,其核心差异源于系统架构和控制逻辑的设计差异。组串式交流侧需变压器升压至10kV/35kV,高压直挂式可直接输出6kV/35kV电压,减少转换损耗。多台小功率PCS并联(每簇独立管理)单台大功率PCS(多簇直流侧并联)环流导致容量衰减(损失5%–8%)无变压器损耗(效率>99%)高压直挂电站(≥10MW)

竹君子之家 1515

篇三:抽象工厂模式:构建产品族

抽象工厂模式是创建型设计模式,它旨在提供一个接口(抽象工厂),用于创建一组相关或相互依赖的对象,构建产品族。在抽象工厂模式中,每个具体工厂类负责创建一组具体产品类的实例,而客户端代码只与抽象工厂和抽象产品类打交道,无需直接创建具体产品类的实例。在C++中,通过定义抽象工厂接口和抽象产品类,然后由具体工厂子类来实现工厂接口,从而实现了对象创建与使用的分离。在C++中,可以使用虚函数和抽象类来定义抽象工厂接口和抽象产品类,然后由具体工厂子类来实现工厂接口,根据需要返回相应的产品类的实例。,并分别由具体工厂类。

Jake_cai的博客 655

开关电源EMC整改案例-辐射骚扰

2.4.1 获得原始数据。同样的分析可以应用在差模电流的情况, 唯一不同的是, 两根导线的磁场分布是相反的, 磁 场互相抵消, 由于导线中的电流大小相等, 产生的磁场 H 大小相同, 在互相靠近的情况下, 在磁 环内的两个感应磁场大小相同、方向相反, 因此合成之后的感应磁场 B 几乎为 0,对任意一根导 线而言,相当于是一段“无感导线”,对差模电流不会产生任何抑制作用。众所周知, 共模电感的匝数越多, 感量越大, 按道 理来说对共模干扰电流的抑制也会越强烈,对抗辐射 也越有利,然而事实真的如此吗?

经营范围: CTA、SRRC、CCC、移动、电信、联通入库 3496

【设计模式】创建型-抽象工厂模式

正因为抽象工厂模式存在“开闭原则”的倾斜性,它以一种倾斜的方式来满足“开闭原则”,为增加新产品族提供方便,但不能为增加新产品结构提供这样的方便,因此要求设计人员在设计之初就能够全面考虑,不会在设计完成之后向系统中增加新的产品等级结构,也不会删除已有的产品等级结构,否则将会导致系统出现较大的修改,为后续维护工作带来诸多麻烦。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的 产品对象的创建。

qq_53662373的博客 1291

图像处理之边缘检测[微分算子、Canny算子和LOG算子]

LOG算子是在经典算子的基础上发展起来的边缘检测算子,根据信噪比求得检测边缘的最优滤波器。边缘总是以强度突变的形式出现,可以定义为图像局部特性的不连续性,如灰度的突变和纹理结构的突变等。图像的边缘包含了物体形状的重要信息,它不仅在分析图像时大幅度地减少了要处理的信息量,而且还保护了目标的边界结构。对于复杂的图像,采用Roberts算子不能较好地得到图像的边缘,而需要采用更加复杂的3X3的算子比如Prewitt算子。对于离散的图像f(x,y),边缘检测算子是用图像的垂直和水平差分来逼近梯度算子,即。

qq_44111805的博客 9833

YOLOv13:目标检测的全面攻略与实战指南

本文是关于 YOLOv13 的全攻略文章。先回顾 YOLO 系列发展,点明 YOLOv13 在该系列中的创新地位,阐述其基于 HyperACE、FullPAD 和轻量级卷积替换等技术的独特优势。深入剖析各核心技术原理,通过与其他版本及实际场景对比展现其性能优势。介绍项目结构与使用方式,分享数据增强、锚框优化等实用技巧,并列举安防监控、自动驾驶等领域应用案例。最后总结 YOLOv13 价值,展望目标检测技术未来发展趋势,为读者提供全面的 YOLOv13 学习与实践指导。

邓邓子的博客 3434

创建型设计模式-抽象工厂

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

wind_chasing_boy的博客 722

Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示

调用串口IP核CoreUARTAPB,并例化到顶层设计,发现UART_RX管脚在进行管脚分配时没有显示出来,最后发现是CoreAPB3总线IP核配置不对导致,改为如下配置后正常。

whik1194的博客 757

对抽象工厂模式的理解

小明家新开了两个工厂用来生产家具,一个生产现代风格的沙发和椅子,一个生产古典风格的沙发和椅子,现在工厂收到了一笔订单,请你帮他设计一个系统,描述订单需要生产家具的信息。接下来的 N 行,每行输入一个字符串,字符串表示家具的类型。家具类型分为 “modern” 和 “classical” 两种。对于应用层,需要操作按钮和复选框,前提是获取对应的对象。而不同操作系统,返回的对象应该不同。输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示订单的数量。对于每笔订单,输出字符串表示该订单需要生产家具的信息。

南七行者的博客 1052

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

抽象工厂模式学习总结

抽象工厂模式 引言 工厂模式是抽象工厂模式特例,在工厂模式中,一个工厂对应一个产品,在抽象工厂模式中,一个工厂对应N个产品,当N=1时,抽象工厂模式就退化成了工厂模式。 抽象工厂模式重要等级★★★★★ 抽象工厂模式难度等级★★★★☆ 定义 英文定义:"Provide an interface...

江川的博客 3545

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

常用设计模式——抽象工厂模式

本篇博客给大家介绍常用设计模式中的抽象工厂模式。本节要介绍的抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。

weixin_45676761的博客 4935

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java中抽象工厂模式_抽象工厂模式(详解版)

前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。本节要介绍的抽象工厂模式将考虑多等级产...

weixin_35823048的博客 2282

抽象工厂模式详解

抽象工厂模式 模式动机与定义 模式动机 产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机、海...

泰斗贤若如的博客 1046
上一篇: 工厂模式
下一篇: 【前缀和】和为k的连续子数组
荼锦AI编程
博客等级 码龄7年 198粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值