抽象工厂模式(AbstractFactoryPattern)

news2025/1/15 19:38:09

文章目录

  • 1.抽象工厂模式定义
  • 2.UML类图
  • 3.抽象工厂模式具体实现
    • 工厂模式实现单一产品族
    • 抽象工厂实现多产品族
    • 产品类
    • 工厂类
    • 使用
  • 4.抽象工厂模式优缺点

1.抽象工厂模式定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 工厂方法模式是单一产品族,抽象工厂方模式是多系列产品族。

2.UML类图

在这里插入图片描述

  • 抽象工厂:声明了创建抽象产品对象的操作接口。
  • 具体产品工厂:实现了抽象工厂的接口,负责创建产品对象。
  • 产品抽象类或接口:定义一类产品对象的接口。
  • 具体产品实现:定义一个将被相应具体工厂创建的产品对象。

3.抽象工厂模式具体实现

本文基于生产电脑周边产品的例子

工厂模式实现单一产品族

public abstract class Keyboard 
{
    // 生产键盘
    public abstract void Create();
}

public class HPKeyboard : Keyboard
{
    public override void Create()
    {
        Console.WriteLine("生产惠普键盘");
    }
}

public class DellKeyboard : Keyboard
{
    public override void Create()
    {
        Console.WriteLine("生产戴尔键盘");
    }
}

public class LenovoKeyboard : Keyboard
{
    public override void Create()
    {
        Console.WriteLine("生产联想键盘");
    }
}

// 键盘工厂抽象类
public abstract class KeyboardFactory
{
    // 取得键盘实例
    public abstract Keyboard GetInstance();
}

public class HPKeyboardFactory : KeyboardFactory
{
    public override Keyboard GetInstance()
    {
        return new HPKeyboard();
    }
}

public class DellKeyboardFactory : KeyboardFactory
{
    public override Keyboard GetInstance()
    {
        return new DellKeyboard();
    }
}

public class LenoveKeyboardFactory : KeyboardFactory
{
    public override Keyboard GetInstance()
    {
        return new LenovoKeyboard();
    }
}

使用:

// 生产惠普键盘
new HPKeyboardFactory().GetInstance().Create();
// 生产戴尔键盘
new DellKeyboardFactory().GetInstance().Create();
// 生产联想键盘
new LenoveKeyboardFactory().GetInstance().Create();

抽象工厂实现多产品族

产品类

// 鼠标抽象类
public abstract class Mouse
{
    public abstract void Create();
}

public class DellMouse : Mouse
{
    public override void Create()
    {
        Console.WriteLine("生产戴尔鼠标");
    }
}

public class HPMouse : Mouse
{
    public override void Create()
    {
        Console.WriteLine("生产惠普鼠标");
    }
}

// 显示器抽象类
public abstract class Monitor
{
    public abstract void Create();
}

public class DellMonitor : Monitor
{
    public override void Create()
    {
        Console.WriteLine("生产戴尔显示器");
    }
}

public class HPMonitor : Monitor
{
    public override void Create()
    {
        Console.WriteLine("生产惠普显示器");
    }
}

工厂类

// 工厂抽象类。工厂分为Dell工厂和HP工厂,各自负责品牌内产品的创建
public abstract class Factory
{
    public abstract Keyboard CreateKeyboard();
    public abstract Mouse CreateMouse();
    public abstract Monitor CreateMonitor();
}

public class DellFactory : Factory
{
    public override Keyboard CreateKeyboard()
    {
        return new DellKeyboard();
    }

    public override Monitor CreateMonitor()
    {
        return new DellMonitor();
    }

    public override Mouse CreateMouse()
    {
        return new DellMouse();
    }
}

public class HPFactory : Factory
{
    public override Keyboard CreateKeyboard()
    {
        return new HPKeyboard();
    }

    public override Monitor CreateMonitor()
    {
        return new HPMonitor();
    }

    public override Mouse CreateMouse()
    {
        return new HPMouse();
    }
}

使用

// 抽象工厂模式
Console.WriteLine("----------------------- 抽象工厂模式 ----------------------------");
new DellFactory().CreateKeyboard().Create();    // 生产戴尔键盘
new DellFactory().CreateMonitor().Create();     // 生产戴尔显示器
new DellFactory().CreateMouse().Create();       // 生产戴尔鼠标

new HPFactory().CreateKeyboard().Create();      // 生产惠普键盘
new HPFactory().CreateMonitor().Create();      // 生产惠普显示器
new HPFactory().CreateMouse().Create();      // 生产惠普鼠标

4.抽象工厂模式优缺点

  • 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1、Docker之技术架构演进之路

1、Docker之技术架构演进之路 概述常见概念基本概念应用(Application)/ 系统(System)模块(Module)/ 组件(Component)分布式(Distributed)集群(Clu…

OpenStack配置 之 不同cpu迁移虚拟机

介绍 OpenStack是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。 OpenStack由NASA(美国国家航空航天局)和Rackspace合作研发并发起,以Apache许可证(Apache软件基金会发布的一个自由软件许可证&#xff…

基于antd的DatePicker 组件封装业务组件

先看一下我写的目录结构: 依次来看业务代码; (1)RangeTime.tsx import {useState,uesCallback} from react; import {DatePicker} from antd; import {RangePickerProps as AntdRangePickerProps} from antd/es/date-picker; import {Moment} from moment; import type {Ran…

【Spring Security系列】权限之旅:SpringSecurity小程序登录深度探索

作者:后端小肥肠 创作不易,未经允许严禁转载。 姊妹篇: 【Spring Security系列】Spring SecurityJWTRedis实现用户认证登录及登出_spring security jwt 退出登录-CSDN博客 1. 前言 欢迎来到【Spring Security系列】!在当今数字化…

【Java】/*类和对象(下)*/

目录 一、封装 1.1 初识封装 1.2 如何封装成员变量 1.3 如何使用封装后的成员变量 二、访问限定符 三、包 3.1 包的概念 3.2 如何自定义包 3.3 导入包中的类 3.4 包的访问权限控制举例 示例一:private修饰成员变量 示例二: 不去修饰成员变…

网络拓扑—DNS服务搭建

文章目录 DNS服务搭建网络拓扑配置网络DNSPC 安装DNS服务配置DNS服务创建正向查找区域创建反向查找区域创建子域名 PC机DNS域名解析 DNS服务搭建 网络拓扑 为了节省我的U盘空间,没有用路由器,所以搭建的环境只要在同网段即可。 //交换机不用考虑 DNS&a…

hugging face笔记:PEFT

1 介绍 PEFT (Parameter-Efficient Fine Tuning) 方法在微调时冻结预训练模型参数,并在其上添加少量可训练的参数(称为适配器)这些适配器被训练用来学习特定任务的信息。这种方法已被证明在内存效率和计算使用上非常高效,同时能产…

靠着单干实现财富自由,可太爽了

这里所说的“单干”,并不是单打独斗的意思,而是一种商业认知,以及由这种认知衍生出来的商业模式、商业方法和商业实践。 之前提到单干,会本能地以为它是指脱离公司等组织形式,自己一个人做生意。现在单干有了更丰富的…

第十二章 网络编程

第十二章 网络编程 网络协议概述 通信协议: 协议即规则,就好比汽车上路要遵守交通规则一样,为了使全世界不同类型的计算机都可以连接起来,所以制定了一套全球通用的通信协议——Internet协议。有了Internet协议,任何…

【网络技术】【Kali Linux】Wireshark嗅探(十二)NBNS协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客: 【网络技术】【Kali Linux】Wireshark嗅探(一)ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探(二)TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

Swift 类和结构体

类和结构体 一、结构体和类对比1、类型定义的语法2、结构体和类的实例3、属性访问4、结构体类型的成员逐一构造器 二、结构体和枚举是值类型三、类是引用类型1、恒等运算符2、指针 结构体和类作为一种通用而又灵活的结构,成为了人们构建代码的基础。你可以使用定义常…

汇舟问卷:海外问卷调查如何闭坑?

大家好,我是汇舟问卷。有很多人问我这行有什么骗局吗?怎么说呢?其实每个行业都是真实存在的,也都有赚到钱的和赚不到钱的,那区别在哪里呢? 在你的源头,也就是教你或者说是代理加盟的上家&#…

LabVIEW舱段测控系统开发

LabVIEW舱段测控系统开发 在航空技术飞速发展的当下,对于航空器的测控系统的需求日益增加,特别是对舱段测控系统的设计与实现。开发了一款基于LabVIEW开发的舱段测控系统,包括系统设计需求、系统组成、工作原理以及系统实现等方面。 开发了…

电赛经验分享——赛前准备

⏩ 大家好哇!我是小光,想要成为系统架构师的嵌入式爱好者。 ⏩在之前的电赛中取得了省一的成绩,本文对电赛比赛前需要准备什么做一个经验分享。 ⏩感谢你的阅读,不对的地方欢迎指正。 加入小光嵌入式交流群(qq群号&…

【问题解决】Android Studio Jellyfish新建Kotlin项目后Gradle Sync及Maven下载很慢

创建新项目之后,Gradle Sync和Build都很慢,因为下载Gradle和Maven等工具。 代码默认配置 settings.gradle.kts pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.g…

框架学习之SpringMVC学习笔记(一)

一、SpringMVC简介 1-介绍 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。 在控制层…

C语言中的 ?: :三元运算符详解

C语言中的 ?: :三元运算符详解 在C语言的浩瀚代码海洋中,三元运算符(?:)如同一位优雅的舞者,以简洁的姿态完成条件判断与赋值的双重任务。它以问号(?)和冒号(:)这两个…

魔众文库系统v6.6.0分销功能,后台日志重构,文档转换优化

分销功能,后台日志重构,文档转换优化 [新功能] 升级支持支付宝授权登录最新方式 [新功能] 后台左上角标题支持自定义,修改 modstart.php 中 admin.title 配置 [新功能] 日志界面重构,全新日志查看体验 [新功能] 链接选择弹窗增…

C语言 | Leetcode C语言题解之第110题平衡二叉树

题目: 题解: int height(struct TreeNode* root) {if (root NULL) {return 0;}int leftHeight height(root->left);int rightHeight height(root->right);if (leftHeight -1 || rightHeight -1 || fabs(leftHeight - rightHeight) > 1) {…

SpringBoot3整合阿里云短信服务-1(配置阿里云短信服务)

SpringBoot3整合阿里云短信服务-1(配置阿里云短信服务) 一、开通阿里云短信服务 阿里云官网:阿里云官网 选择产品中企业服务与云通信中的短信服务 选择免费开通 选择快速学习和测试 根据这几个全部配置一下我这里是配置好了所以学习进度是100% 1.1 添加资质 首先选择新增资质 …