《java与模式》笔记(十) 抽象工厂模式

《JAVA与模式》之抽象工厂模式 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。场景问题举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU、硬盘、内存、主板、电源、机箱等。为讨论使用简单点,只考虑选择CPU和主板的问题。事实上,在选择CPU的时候,面临一系列的问题,比如品牌、型号、针脚数目、主频等问题,只有把这些问题都确定下来,才能确定具体的CPU。 阅读详情

ξ 14.1 引言

☆ 抽象工厂模式的用意:抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。

☆ 对抽象工厂模式理解的三个步骤:
① 当系统中有多个抽象产品角色的时候,假设产生抽象产品角色的是实现了抽象工厂角色的具体工厂角色。

② 阶段一的假设无法成立,因为抽象产品角色无法被实例化。根据里氏替代原则,可以让具体工厂角色产生抽象产品角色的实现类,即具体产品角色。

③ 如果抽象产品角色有多个具体实例即具体产品角色,那么工厂(具体和抽象)角色应该提供不同的方法产生不同的具体产品角色。


ξ 14.2 问题
☆ 产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。下图详细说明产品等级结构和产品族的关系:

从上图可以看出,对应的每一个产品族,都由一个具体工厂负责创建,在同一产品族中不同等级结构上的具体产品,由具体工厂的每个方法创建。

ξ 14.3 抽象工厂模式的结构
☆ 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开,可以引入抽象工厂模式。这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公共的工厂接口请求所需要的产品。下面举例说明这种结构:

图中有两个等级结构,A和B。两个产品族1和2。可以看到,对于一个产品族有一个实现了抽象工厂角色的具体工厂角色(ProductA1和ProductA2对应ConcreteCreator1,ProductA2和ProductB2对应ConcreteCreator2),而同一个产品族内不同的等级结构,对应具体工厂角色里面的不同方法(ProductA1和ProductA2对应factoryA方法,ProductB1和ProductB2对应factoryB方法)。下面是源代码:

public interface Creator
{
    ProductA factoryA();
    ProductB factoryB();
}


public class ConcreteCreator1 implements Creator
{
    
public ProductA factoryA()
    
{
        
return new ProductA1() ;
    }

    
    
public ProductB factoryB()
    
{
        
return new ProductB1() ;
    }

}


public class ConcreteCreator2 implements Creator
{
    
public ProductA factoryA()
    
{
        
return new ProductA2() ;
    }

    
    
public ProductB factoryB()
    
{
        
return new ProductB2() ;
    }

}


public interface ProductA
{
}


public class ProductA1 implements ProductA
{
    
public ProductA1() {}
}


public class ProductA2 implements ProductA
{
    
public ProductA2() {}
}


public interface ProductB
{
}


public class ProductB1 implements ProductB
{
    
public ProductB1() {}
}


public class ProductB2 implements ProductB
{
    
public ProductB2() {}
}

ξ 14.4 在什么情况下应该使用抽象工厂模式
① 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是很重要的;
② 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;
③ 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
④ 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

ξ 14.7 “开-闭”原则
当抽象工厂模式中新加产品族的时候,只需要添加抽象工厂角色和抽象产品角色的具体角色并建立起相应的关系就可以,这个时候抽象工厂模式是支持“开-闭”原则的;
当增加产品等级结构时,需要改动抽象工厂角色和修改每个具体工厂角色,这个时候,抽象工厂模式是不满足“开-闭”原则的。
综合来看,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。
 
=============================
最后总结一下:
☆ 首先举一个比较具体的例子。在UI设计中,一般会有许多控件,比如按钮(Button)和文本框(Text),这里Button和Text就是两个等级结构的产品。而为了在Windows和Macintosh系统中提供不同的效果,需要有Windows Button、Windows Text,同理会有Macintosh Button和Macintosh Text,这里Windows和Macintosh就是两个产品族,下图说明了它们之间的关系:

下面是源代码:

// 首先是Factory接口,它是抽象工厂角色
public interface Factory
{
    
// 创建按钮
    Button createButton();

    
// 创建文本框
    Text createText();
}


// 下面是Factory接口的默认实现,这里使用了默认适配模式
public abstract class AbstractFactory implements Factory
{
    
// 抽象方法,派生类实现
    public abstract Button createButton();
    
    
// 抽象方法,派生类实现
    public abstract Text createText();
    
    
// 根据标识选择创建何种具体工厂角色(选择产品族)
    public static Factory getFactory(String flag)
    
{
        Factory result 
= null ;

        
if( flag.equalsIgnoreCase("macintosh") )
        
{
            result 
= MacFactory.getInstance() ;
        }

        
else if( flag.equalsIgnoreCase("windows") )
        
{
            result 
= WinFactory.getInstance() ;
        }

        
        
return result ;
    }

}


// 下面是Macintosh产品族的具体工厂角色
public class MacFactory extends AbstractFactory
{
    
// 单例模式,私有构造函数
    private MacFactory() {}

    
// 创建Macintosh产品族按钮
    public Button createButton()
    
{
        
return new MacButton() ;
    }

    
    
// 创建Macintosh产品族文本框
    public Text createText()
    
{
        
return new MacText() ;
    }

    
    
// 提供单例的方法
    synchronized public static Factory getInstance()
    
{
        
if( null == _instance )
            _instance 
= new MacFactory() ;
        
        
return _instance ;
    }

    
    
private static MacFactory _instance = null ;
}


// 下面是Widnows产品族的具体工厂角色
public class WinFactory extends AbstractFactory
{
    
// 单例模式,私有构造函数
    private WinFactory() {}

    
// 创建Widnows产品族按钮
    public Button createButton()
    
{
        
return new WinButton() ;
    }

    
    
// 创建Widnows产品族文本框
    public Text createText()
    
{
        
return new WinText() ;
    }

    
    
// 提供单例的方法
    synchronized public static Factory getInstance()
    
{
        
if( null == _instance )
            _instance 
= new WinFactory() ;
        
        
return _instance ;
    }


    
private static WinFactory _instance = null ;
}


// 下面是等级结构中Button的抽象产品角色
public interface Button
{
}


// 下面是Button的Macintosh产品族具体产品角色
public class MacButton implements Button
{
    
public MacButton() {}
}


// Button的Windows产品族具体产品角色
public class WinButton implements Button
{
    
public WinButton() {}
}


// 等级结构中Text的抽象产品角色
public interface Text
{
}


// Text的Macintosh产品族具体产品角色
public class MacText implements Text
{
    
public MacText() {}
}


// Text的Windows产品族具体产品角色
public class WinText implements Text
{
    
public WinText() {}
}


☆ 下面给出三种常见形态的工厂模式的相图,依次是抽象工厂模式、工厂方法模式和简单工厂模式:

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

相关推荐

【Java教程】Java 抽象工厂模式

Java设计模式 - 抽象工厂模式 抽象工厂模式是另一个创建模式。 抽象工厂模式,也称为工厂的工厂,有一个工厂创建其他工厂。 当使用抽象工厂模式时,我们首先使用超级工厂创建工厂,然后使用创建的工厂创建对象。 例子 下面的代码展示了如何使用抽象工厂模式。 我们将要创建形状和打印机。对于形状,我们会有圆形,矩形和正方形。对于打印机,我们将有纸张打印机,网络打印机和屏幕打印机。 对于shape,我们将创建Shape界面,如下所示: interface Shape { void draw(); } 然后我们

muli526的博客 1045

Java面试必备:工厂模式与抽象工厂模式的区别

在面向对象编程中,工厂模式和抽象工厂模式都是常用的创建型设计模式,它们都用于对象的创建,但有着不同的应用场景和实现方式。本文将详细探讨这两种模式的区别,并通过示例和流程图帮助理解。

qq_58299462的博客 1845

设计模式 - 抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。这种模式特别适用于需要创建一系列相关产品的情况,而且这些产品的具体实现可能会随着环境的不同而改变。本文将详细介绍抽象工厂模式的概念,并通过具体的Java代码示例来说明如何实现这一模式。

菜鸟小码的博客 2311

Java工厂模式及抽象工厂模式详解

class ProductA implements Product { public void use() { System.out.println("使用产品A");class ProductB implements Product { public void use() { System.out.println("使用产品B");@Override public void paint() { System.out.println("Windows风格按钮");// 具体产品(Windows风格)

1893

Java中工厂模式与抽象工厂模式的实现

工厂模式是软件开发中最为常用的设计模式之一。它提供了一种创建对象的最佳方式,在面向对象编程中,当创建复杂对象的逻辑与使用对象的逻辑分离时,工厂模式就显得非常有用。工厂模式主要解决了两个问题:一是创建与使用相分离,二是降低系统的耦合度。工厂模式体现了开闭原则(Open-Closed Principle),即软件实体应当对扩展开放,对修改关闭。通过接口或抽象类,可以定义创建对象的逻辑,并且使得客户端代码与实现类解耦。

weixin_42300144的博客 950

win10+conda+pytorch-gpu安装

pytorch 官网上只有linux和Mac的程序包,没有windows系统的,但是windows系统还是可以用pytorch的。  github: https://github.com/peterjc123/pytorch-scripts 首先要安装anaconda: 推荐清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ ...

一摩尔自由的博客 1万+

工厂模式与抽象工厂模式

工厂模式 模式定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类 作用:实现了创建者和调用者的分离 详细分类:  简单工厂模式  工厂方法模式  抽象工厂模式 核心本质:  实例化对象不使用new,用工厂方法代替  将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。 三种模式: ◆简单工厂模式  用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码),不满足开闭原则 ◆工厂方法模式  用来生产同一等级结构

qq_41784749的博客 1万+

汽车LED驱动芯片TPS92682-Q1 SPI接口配置与调试实战指南

SPI(串行外设接口)作为一种高速、全双工的同步串行通信总线,广泛应用于微控制器与外围设备之间的数据交换。其工作原理基于主从架构,通过时钟、数据线和片选信号实现设备间的精准时序控制。在汽车电子和工业控制领域,SPI因其简单高效、易于扩展的特性,成为配置复杂电源管理芯片、传感器和存储器的关键技术。通过SPI接口,工程师能够动态调整设备参数、实时读取状态信息,并实现复杂的故障诊断与保护策略,极大地提升了系统的灵活性与可靠性。本文以汽车级双通道LED恒流驱动器TPS92682-Q1为例,深入解析如何通过SPI接口

weixin_29185493的博客 288

23种设计模式——抽象工厂模式

抽象工厂本质:选择产品族的实现

qq_51165184的博客 7206

深入解析 RLHF(Reinforcement Learning from Human Feedback)

随着人工智能(AI)技术的快速发展,大规模语言模型(如 OpenAI 的 GPT、Anthropic 的 Claude 等)已经能够生成高质量的文本。RLHF 是一种基于强化学习(Reinforcement Learning, RL)的优化方法,它结合人类反馈(Human Feedback)来训练奖励模型(Reward Model, RM),进而优化语言模型的生成策略。整个强化学习的目标是找到最优策略 π∗\pi^*π∗,使得模型在与环境交互的过程中,最大化累积奖励。RLHF 是一种结合强化学习(RL)

lqq 1771

R语言caret拟合模型:train函数构建xgBoost Dart模型、模型调优、自定义设置trainControl函数和tuneLength参数

R语言caret拟合模型:train函数构建xgBoost Dart模型、模型调优、自定义设置trainControl函数和tuneLength参数

statistics+insight+vista+power 530

java设计模式【抽象工厂模式】

抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不同的产品实例,而无需关心它们实际实现的是哪个具体产品。

qq_42872720的博客 2619

【软考中级】多媒体应用设计师复习笔记第十章【free】

第10章法律法规与标准规范 行业标准 缩写的大写拼音 地方标准 DB加生代码 企业标准Q加斜线企业代号国际标准是国际标准化组织ISO和国际电工委员会IEC制定的标准 国家标准是由国务院标准化行政主管部门制定,全国范围内使用 ?强制性国家标准的代号为GB,推荐性国家标准的代号为GB/T。 ?软件开发规范GB8566-88属于强制性国家标准 在这里插入图片描述 行业标准代号由大写汉语拼音字母组成,加上斜线和T,组成推荐性行业标准,如XX/T。已经发布的行业代号有QJ(航天),SJ(电子

weixin_47120900的博客 641

Java工厂模式详解:方法工厂模式与抽象工厂模式

方法工厂模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。抽象工厂模式(Abstract Factory Pattern)提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。方法工厂模式和抽象工厂模式都是用于创建对象的设计模式,但它们的应用场景和侧重点不同。方法工厂模式侧重于单个对象的创建,通过子类决定实例化哪个类;

2401_83447580的博客 1911

基于BERTopic模型的英文20新闻数据集主题聚类及可视化

BERTopic是基于深度学习的一种主题建模方法。BERT是一种用于NLP的预训练策略,它成功地利用了句子的深层语义信息。

Cachel Wood的博客 1461

基于simulink的电动汽车电机驱动系统IGBT开路故障检测

本文介绍了基于Simulink的电动汽车电机驱动系统IGBT开路故障检测方法。通过搭建永磁同步电机(PMSM)驱动系统模型,实现IGBT开路故障注入,并设计基于电流平均值与PWM逻辑比较的故障检测算法。系统可实时采集三相电流信号,通过MATLAB Function模块实现故障诊断,当检测到PWM信号与电流不匹配时输出故障报警。仿真结果显示,系统能在2.05秒内准确识别A相上管开路故障,并通过Scope和XYGraph直观展示故障特征。该方法为电动汽车电力电子系统故障诊断与容错控制提供了实用解决方案,后续可扩

xiaoheshang_123的博客 149

java设计模式——抽象工厂模式

一、工厂方法的定义与类型 1、定义: 抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口 无须指定他们具体的类 2、类型: 创建型 二、抽象工厂的适用场景 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现 三、抽象工厂的优点 具体产品在应用层代码隔离,无须关心创建细节 将一个系列的产品族统到一起创建 三、抽象工厂的缺点 规

小志的博客 648

【项目实战】Java9的新特性模块化(Module)

Java 9引入了模块化系统,称为"Java Platform Module System"(JPMS)这个系统允许将Java程序分成模块,每个模块都有自己的规范,可以明确地声明它依赖于哪些其他模块,并且只能访问被其所依赖的模块暴露的API。这样可以模块化就是增加了更高级别的聚合,是Package的封装体。Package是一些类路径名字的约定,而模块是一个或多个Package组成的封装体。

奶爸的编程之路,也就一周冷个三天 1896

Java设计模式详解:抽象工厂模式

对于初学者来说,设计模式可能显得有些抽象和复杂,但其实它就像一辆汽车,每个模式都是汽车上的一个零件,各有用途,但组合起来就能解决各种复杂问题。抽象工厂模式也不例外,它是创建型设计模式中的一种,用于创建一系列相互关联或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式是一种非常强大的设计模式,它能够帮助我们解耦对象的创建逻辑,使得系统更加灵活和可扩展。但是,也要注意不要过度使用,因为过多的抽象和工厂类可能会增加系统的复杂性和维护成本。所以,在决定是否使用抽象工厂模式时,一定要根据具体需求和场景来权衡利弊。

Jz_Stu的博客 1883

STM32F407中文手册

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Go和Java实现抽象工厂模式

Go和Java实现抽象工厂模式

YIYIYI 1583

visio安装包

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

【设计模式】抽象工厂模式及其在Java源码中的应用

目录 一、目的 二、例子 三、抽象工厂模式UML图 ​四、Java代码示例 1.库房(抽象工厂) 2.戴尔库房(具体工厂) 3.华为库房(具体工厂) 4.充电器(抽象产品) 5.笔记本(抽象产品) 6.戴尔笔记本(具体产品) 7.华为笔记本(具体产品) 8.华为充电器(具体产品) 9.戴尔充电器(具体产品) 10.Client(理论上仅由抽象产品与抽象工厂实现) 五、Java源码中的抽象工厂案例 1.Connection 2.Statement 3.Prepared.

MengYan89的博客 1311

老版QQ原生表情gif动态

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

java实现工厂模式与抽象工厂模式

java—实现工厂模式与抽象工厂模式 1.使用工厂模式 问题:现有电脑产品windows和apple,请试用工厂模式描述该场景。 思路: 1. 根据描述,我们可以先创建两个产品类:Windows类和Apple类,然后定义一个产品接口,让这两个类实现接口方法表示类已经创建。 public interface Product { public void run(); } public class ...

海旋风的博客 781

Java 设计模式——抽象工厂模式

本文介绍了抽象工厂模式的相关知识。

代码星辰的博客 1419

深入解析Java抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式定义了一个接口,用于创建相关的对象族,而不需要明确指定具体类。它通常包含多个工厂方法,每个工厂方法创建一类对象。通过抽象工厂,客户端可以通过调用工厂方法来创建对象,但客户端并不需要知道具体的类实现。首先,我们定义两个抽象产品类,分别代表按钮(Button)和文本框(TextField// 抽象产品1:Button// 抽象产品2:TextField// 具体产品1:WindowsButton@Override@Override// 具体产品2:MacButton。

一碗黄焖鸡三碗米饭的博客 1060

Java设计模式 | 抽象工厂模式

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级(种类)的产品。要点+demo!

但行好事,莫问前程 1389

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

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

weixin_35823048的博客 2282
上一篇: 《java与模式》笔记(九) 工厂方法模式
下一篇: 《java与模式》笔记(十一) 单例模式
plusir
博客等级 码龄24年 11粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值