设计模式系列之抽象工厂模式(Abstract Factory)

【重温设计模式】抽象工厂及其Java示例 我们详细地探讨了抽象工厂模式,从它的概念、特点、结构和组成,到Java实现,再到优缺点和实际应用,我尽可能地将抽象工厂模式的各个角度做了全面的阐述。我们知道,抽象工厂模式是一种非常实用的设计模式,它可以帮助我们更好地抽象和封装代码,提高代码的可维护性和可扩展性。然而,设计模式并非银弹,我们需要根据实际的项目需求和场景来选择合适的设计模式。抽象工厂模式虽好,但并不适合所有的场景。当我们的系统的产品有多于一个的产品族,而系统只消费其中某一族的产品时,抽象工厂模式是一个不错的选择。 阅读详情

抽象工厂就是一个把工厂抽象,工厂模式生产的是产品,抽象工厂生产的是工厂。这种类型的设计模式属于创建型模式。
就相当于一个工厂生产一件产品,现在有多个产品了。比如生产汽车,首先一个工厂用于生产汽车原胚,另一个工厂用于生产汽车颜料,但这两个工厂都属于同一个集团,由集团统一进行组合成不同颜色的车进行售卖,集团就是这个抽象工厂。

那么抽象工厂用来干嘛呢?
抽象工厂提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类,主要也是解决接口选择的问题。

怎么实现抽象工厂呢?
在工厂模式的基础上,再抽象出一个更大的工厂用于生产这些工厂
首先我们需要先有至少2个工厂模式(CarFactory和ColorFactory)去生产产品,这两个工厂类都继承于集团的这个抽象工厂(AbstractFactory)

public abstract class AbstractFactory {
    public abstract Car getCar(String carName);

    public abstract Color getColor(String color);
}

这里可以看到,集团的这个抽象工厂(AbstractFactory)里聚合了2个工厂模式(CarFactory和ColorFactory),用于生产产品

public class CarFactory extends AbstractFactory {

    @Override
    public Car getCar(String carName) {
        if(carName == null){
            return null;
        }

        if("CarOne".equals(carName)){
            return new CarOne();
        }

        if("CarTwo".equals(carName)){
            return new CarTwo();
        }

        return null;
    }

    @Override
    public Color getColor(String color) {
        return null;
    }
}

public class ColorFactory extends AbstractFactory {

    @Override
    public Car getCar(String carName) {
        return null;
    }

    @Override
    public Color getColor(String color) {
        if(color == null){
            return null;
        }

        if("red".equals(color)){
            return new RedColor();
        }

        if("blue".equals(color)){
            return new BlueColor();
        }

        return null;
    }
}

现在我们有了2个工厂模式(工厂模式的具体实现请看工厂模式(Factory)),那么怎么去生产工厂,再让工厂去生产产品呢?就需要一个工厂的生产类AbstractFactoryProducer

public class AbstractFactoryProducer {
    public static AbstractFactory getFactory(String factoryName){
        if("Car".equals(factoryName)){
            return new CarFactory();
        }

        if("Color".equals(factoryName)){
            return new ColorFactory();
        }

        return null;
    }
}

这样我们就能随意的获取指定的工厂去生产对应的产品

public class AbstractFactoryDemoTest {

    public static void main(String[] args) {
        // 获取车辆生产工厂
        AbstractFactory carFactory = AbstractFactoryProducer.getFactory("Car");

        // 获取车辆
        assert carFactory != null;
        Car carOne = carFactory.getCar("CarOne");
        carOne.get();
        Car carTwo = carFactory.getCar("CarTwo");
        carTwo.get();

        // 获取颜色生产工厂
        AbstractFactory colorFactory = AbstractFactoryProducer.getFactory("Color");

        // 获取颜色
        assert colorFactory != null;
        Color red = colorFactory.getColor("red");
        red.fill();
        Color blue = colorFactory.getColor("blue");
        blue.fill();
    }
}

欢迎关注我的公众号

【愚公系列】二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情

相关推荐

反激变压器设计学习笔记

反激变压器匝比感量设计

m0_55419117的博客 5262

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

抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。

tszc95的博客 9863

DeerFlow 在 Windows 上的安装与启动详细步骤

DeerFlow Windows安装与启动指南 DeerFlow是基于LangGraph的AI Agent系统,包含后端服务和前端界面。后端安装需Python 3.12+,创建虚拟环境后安装依赖,需注意解决langgraph版本冲突问题(推荐1.0.8版本)。配置文件中需设置模型参数(如本地Qwen3-32B-AWQ模型)和sandbox配置。启动分为两步:LangGraph Server(端口2024)和Backend Gateway(端口8001)。前端要求Node.js 22+和pnpm,配置.env

笨小孩 581

抽象工厂模式详解

抽象工厂模式(Abstract Factory Pattern)也是一种创建型设计模式,它提供了一种创建一系列相关或者相依赖对象的工厂接口(超级工厂),不同类型的工厂再去实现这个抽象工厂,最后还可提供一个工厂创造者类,通过传入工厂类型参数来创建具体工厂。它是对工厂方法模式的扩展,核心思想是将工厂本身也抽象化,其主旨是围绕一个超级工厂或中心工厂去创建其他工厂,这个超级工厂又称为其他工厂的工厂。它与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级;而抽象工厂模式则是针对的多个产品等级,即一个产品族。

qq_36756227的博客 3471

麦当劳app之sign逆向分析

摘要:本文分析了麦当劳APP请求参数sign的逆向过程。通过抓包发现32位sign参数疑似MD5加密,使用frida-trace工具跟踪CC_MD5函数验证其为标准MD5算法。加密参数包含时间戳、token、版本号等固定和动态字段,拼接后经MD5加密生成sign。文章提供了JS和Python两种实现方案,包含完整的请求头参数和加密逻辑,最终成功获取API响应数据。该研究仅用于逆向技术学习,展示了移动应用常见加密参数的逆向分析方法。

佛系更新... 2437

【ESP 保姆级教程】第三方库篇 ——TimeLib库,一个非常Nice的时间库,结合第三方进行校正时间

Time,这是一个为Arduino提供时间支持的库。 这个库的例子中会教会我们多种方式去获取时间: - 一个`RTC`时钟 - 网络`NTP`时间 - `GPS`时间

单片机菜鸟哥的博客 3674

抽象工厂模式-Abstract Factory Pattern

抽象工厂模式-Abstract Factory Pattern

帕布里克沃德曼的博客 1万+

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1182

抽象工厂(Abstarct Factory)

抽象工厂类(AbstractFactory)定义了创建产品的接口,具体工厂类(ConcreteFactory1 和 ConcreteFactory2)实现了抽象工厂接口,并根据需要创建具体的产品对象。每个具体工厂实现了抽象工厂定义的方法,根据需要创建具体的产品对象。通过抽象工厂模式,我们可以在客户端代码中使用抽象工厂和抽象产品,而不需要直接与具体工厂和具体产品进行交互,从而实现了解耦和灵活的对象创建。具体产品(Concrete Product):实现了抽象产品定义的接口,具体产品是抽象产品的实际实现。

強雲的博客 737

开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记

本文系统介绍了稳压电源的基础知识与应用实验。首先阐述了稳压电源的定义与类型,包括线性稳压电源(如LM7805/7905)和开关稳压电源(降压/升压/升降压式)的工作原理、参数特点及优劣势。随后详细讲解了各类稳压电源的实验设计,如线性稳压电源的电路实现、开关稳压电源的PWM控制方法等。最后汇总了硬件工程师相关的笔试面试资源,涵盖器件知识、电路仿真、企业真题等内容。全文结合理论分析与Multisim仿真,为电子工程学习者提供了稳压电源的实用技术参考。

XU157303764的博客 1640

【YOLO26实战全攻略】19——智慧交通(一):高速抛洒物与事故检测全流程落地

在智慧交通领域,高速公路抛洒物、交通事故等突发状况常导致二次事故与大规模拥堵,传统人工监控存在响应滞后、覆盖有限等痛点。本文基于Ultralytics YOLO26算法,结合ByteTrack多目标跟踪技术,构建从数据准备、模型训练到边缘部署的全栈式智慧交通检测系统。核心内容包括:多车型专属数据集构建、抛洒物检测模型优化、ByteTrack轨迹跟踪集成、异常事件(违停/逆行/碰撞)识别逻辑实现,以及NVIDIA Jetson边缘设备部署方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1490

设计模式系列(六)抽象工厂模式(Abstract Factory Pattern)

设计模式系列(五)抽象工厂模式(Abstract Factory Pattern)     抽象工厂模式

君临天下的博客 991

【MATLAB】STM32电机调速闭环控制工程

本文提出了一种基于MATLAB仿真与STM32实现的直流电机闭环PID调速控制方案。通过MATLAB建立电机数学模型并进行参数整定,仿真验证了增量式PID算法在启停、稳态和抗扰动方面的优越性能。基于STM32F103搭建了硬件系统,实现了编码器测速、定时中断控制、PWM输出等功能。实测表明,该系统转速超调<2%、稳态误差±2r/min,具备快速响应和强抗扰能力。相比开环控制,闭环调速显著提升了动态性能和稳态精度。方案提供了完整的仿真代码和嵌入式工程源码,可直接应用于智能小车、工业传动等场景,具有较高的

unber的博客 50

【图解设计模式系列】The Abstract Factory Pattern: 抽象工厂模式

定义: 抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 provides an interface for creating families of related or dependent objects without specifying their concrete classes. Factory method create objects through inheritance. Abstract factory do it through object co

Tech in Pieces 481

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[创建型模式系列]Abstract factory of Design Pattern模式设计之抽象工厂模式

1 the intention of asbract factory抽象工厂模式的设计意图 to supply interface for a series of related or depedent objects, meanwhile, you do not need tospecify the concrete classes。 提供一个创建一系列相关...

weixin_33785108的博客 104

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

设计模式之抽象工厂模式(创建型)

模式定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 模式角色 抽象工厂模式包含如下角色: AbstractFactory:抽象工厂 ConcreteFactory:具体工厂 Product:具体产品 AbstractProduct:抽象产品 简单例子 抽象...

Nicky's blog 3335

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

设计模式之抽象工厂模式(三)

目录 抽象工厂模式(Abstract Factory) 模式动机: 模式结构: 抽象工厂模式(Abstract Factory) 模式动机: 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。 抽象工厂...

F的博客 179

极速理解设计模式系列:4.抽象工厂模式(Abstract Factory Pattern)

五个角色:抽象产品角色(AbstractProduct)、具体产品角色(Product)、抽象工厂角色(AbstractFactory)、具体工厂角色(ConcreteFactory)、客户端(Client)           抽象产品角色(AbstractProduct):声明产品接口          具体产品角色(Product):实现产品的接口          抽象工厂角色(Ab

K-Ven博文程序员之窗 812

设计模式:抽象工厂模式(Abstract Factory Pattern)

/** * 抽象工厂模式。&amp;lt;br/&amp;gt; * 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 * @author Bright Lee */ public class AbstractFactoryPattern { public static void main(String[] args) { AbstractFactory facto...

look4liming的专栏 320

Java基本类型与包装类型:从内存差异到自动装箱与缓存的深度解析

在Java编程中,基本类型与包装类型是每个开发者都必须掌握的基础概念,也是面试与实战中高频出现的考点。基本类型直接存储值于栈上,而包装类型作为对象存在于堆中,两者在内存占用、性能表现上差异显著。自动装箱与拆箱机制虽然简化了代码,却暗藏陷阱:Integer默认缓存-128到127的对象,导致比较结果不稳定;null值拆箱会触发NullPointerException;循环内大量装箱则易造成GC压力。理解这些原理有助于避免典型错误,提升代码健壮性,并在集合泛型、数据库映射、JSON序列化及性能优化等场景中做出合

weixin_33896726的博客 156

设计模式系列-抽象工厂模式-Abstract Factory

抽象工厂模式简介 在之前有一篇文章介绍了工厂方法模式,其中有个例子是为不同格式的XML开发了各自的解析器,然后把解析出来的XML打印出来,现在需求有了变化,为不同的客户端提供一组不同的解析器,加入有个客户端命名为 NY,我们为它提供了一组解析器的名称为 NYErrorXMLParser ,NYFeedBackXMLParser,NYOrderXMLParser,NYResponseXMLParser,同样的,我们以为名为TW的客户端提供一组类似命名的解析器。此时,抽象工厂方法模式无法满足我们的需求,我们将为

独 coding 乐不如众 coding 乐 349

设计模式系列(06):抽象工厂模式(Abstract Factory)

本文为设计模式系列第6篇,聚焦创建型模式中的抽象工厂模式,涵盖定义、原理、实际业务场景、优缺点、最佳实践及详细代码示例,适合系统学习与实战应用。

1528

PHP 设计模式系列之抽象工厂模式(Abstract Factory)

抽象工厂模式为一组相关或相互依赖的对象创建提供接口,而无需指定其具体实现类。抽象工厂的客户端不关心如何创建这些对象,只关心如何将它们组合到一起。举个例子,如果某个应用是可移植的,那么它需要封装平台依赖,这些平台可能包括窗口系统、操作系统、数据库等等。这种封装如果未经设计,通常代码会包含多个 if 条件语句以及对应平台的操作。这种硬编码不仅可读性差,而且扩展性也不好。提供一个间接的层(即“抽象工厂”)抽象一组相关或依赖对象的创建而不是直接指定具体实现类。该“工厂”对象的职责是为不同平台提供创建服务。客户端不需

vd15528175269的博客 633

抽象工厂模式(Abstract Factory Pattern)介绍抽象工厂模式 是一种创建型设计模式,提供一个接口,用于创建一系列相关或相互依赖的对象(称为产品族),而不需指定具体类

与 StatusDebouncer 的结合: 在你的 StatusDebouncer 场景中,抽象工厂模式可用于创建一组相关对象,如去抖动器(StatusDebouncer)和观察者(LogObserver 或 AlarmObserver),以支持不同去抖动模式(基于次数或时间)。详细代码示例以下是一个详细的抽象工厂模式实现,结合你的 StatusDebouncer 场景,支持基于次数和时间的去抖动,并创建相关观察者。代码兼容 C# 7.3,结合观察者模式和策略模式,并提供测试用例。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 444

【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) 【1.1】抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),AbstractProduct角色定义AbstractFactory角色所生成的抽象产品接口;AbstractFactory(抽象工厂),AbstractFactory角色定义用于生成抽象产品的接口;Client(委托者),Client角色仅仅调用AbstractFactory角色和AbstractProd

CopperSun 技术博客 560
上一篇: 设计模式系列之工厂模式(Factory)
下一篇: 设计模式系列之建造者模式(Builder)
工程师小哥
博客等级 码龄10年 4粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值