抽象工厂模式(AbstractFactoryPattern)

文章目录

  • 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 里加代码,又要在具体的里面加代码。

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

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

相关文章

JavaScript-运算符

算术运算符 返回结果为数字型的运算符 加法运算符 加法运算符()是一个二元运算符,可以对两个数字型的操作数进行相加运算,返回值是两个操作数的和 减法运算符 减法运算符(-)是一个二元运算符,可…

banner2.0自定义轮播布局

说明:最近碰到一个需求,让新闻列表实现轮播图的效果,也就是轮播新闻,然后样式必须按照ui设计的样式来弄,之前传统的banner,都是只轮播图片,没想到,这次居然要轮播新闻, 网…

【深度学习】YOLOv8训练,交通灯目标检测

文章目录 一、数据处理二、环境三、训练 一、数据处理 import traceback import xml.etree.ElementTree as ET import os import shutil import random import cv2 import numpy as np from tqdm import tqdmdef convert_annotation_to_list(xml_filepath, size_width, size_he…

java+ vue.js+uniapp一款基于云计算技术的企业级生产管理系统,云MES源码 MES系统如何与ERP系统集成?

java vue.jsuniapp一款基于云计算技术的企业级生产管理系统,云MES源码,MES系统如何与ERP系统集成? MES系统(制造执行系统)与ERP系统(企业资源规划系统)的集成可以通过多种方式实现,这…

【git】开发提交规范(feat、fix、perf)

这段时间收到的需求很多,可能是临近两周一次的大版本灰度上线,这次产生了一个关于git的思考,就是各个版本之间怎么管理的问题,这里做出我自己的一些方法。 首先,既然已经明确了remote分支中的release分支为主分支&…

Java中transient关键字

transient介绍 在Java中,transient是一个关键字,用于声明一个字段在序列化过程中应该被忽略。当一个对象被序列化时,它的状态(即其字段的值)通常会被保存到字节流中,以便稍后可以反序列化恢复对象的状态。…

如何使用Matlab进行三角剖分(自定义函数实现delaunayTriangulation 使用Bowyer-Watson 算法)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、Delaunay三角形 二、使用步骤 1.Bowyer-Watson算法 2.算法步骤 三、动画演示 四、核心代码 五、对比matlab自带函数和我们的算法: 总结 前…

巨某量引擎后台登录实战笔记 | Playwright自动化框架

前言 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 入正题看看滑块是怎么个事…

CasaOS系统玩客云安装内网穿透工具实现无公网IP远程访问

文章目录 前言1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 前言 2月底,玩客云APP正式停止运营,不再提供上传、云添加功能。3月初,有用户进行了测试,局域网内的各种服务还能继续使用&am…

Ai自动贴图直播项目的趋势,智享自动直播GMV增加工具

在当今社会,直播行业正在悄然地改变着人们的生活方式。无论是在闲暇时光中放松身心,还是在临睡前享受休闲娱乐,观众们越来越习惯于通过刷短视频或者观看直播来消遣自己。根据统计数据显示,到2023年全球将有超过10.74亿网民&#x…

Android 12系统源码_多窗口模式(二)系统实现分屏的功能原理

前言 上一篇我们具体分析了系统处于多窗口模式下,Android应用和多窗口模式相关方法的调用顺序,对于应用如何适配多窗口模式有了一个初步的认识,本篇文章我们将会结合Android12系统源码,具体来梳理一下系统是如何触发多窗口分屏模…

2024全新爆款好物推荐,618必买数码好物清单吐血整理!

​距离618购物狂欢节越来越近了,有很多日常价格不菲的产品在这次活动期间都会进行促销活动,尤其是数码类产品,加上618的优惠活动更有吸引力了。不过面对大促的热潮我们消费者在选购商品的同时还是要擦亮眼睛,避免买到质量不好的商…

[Redis]基本全局命令

Redis存储方式介绍 在 Redis 中数据是以键值对的凡事存储的,键(Key)和值(Value)是基本的数据存储单元。以下是对 Redis 键值对的详细讲解: 键(Key): 类型:…

英伟达:AI之火还在燃烧!

昨晚,全球市场屏息以待的一家公司财报终于发布了,没有超出大家预期的是,他还是超预期了。 大家当然都知道我们要说的是——英伟达! 如今,全球大模型之Z激Z正酣,AI芯片装备竞赛需求猛烈,作为AI…

OPPO Reno12 系列正式发布,仅2699元起售

5月23日,OPPO发布科技潮品 Reno12 系列,包含 Reno12 与 Reno12 Pro,以超美小直屏设计,以及行业首发的新科技,引领全新潮流方向。 据「TMT星球」了解,首次亮相的全新配色 Reno12 「千禧银」与Reno12 Pro的「…

spring常用知识点

1、拦截器和过滤器区别 1. 原理不同: 拦截器是基于java的反射机制,而过滤器采用责任链模式是基于函数回调的。 2. 使用范围不同: 过滤器Filter的使用依赖于Tomcat等容器,导致它只能在web程序中使用 拦截器是一个Sping组件&am…

爆火!开源多模态大模型在手机端进行本地部署!

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型& AIGC 技术趋势、大模型& AIGC 落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了…

Rust Tarui 中的 Scrcpy 客户端,旨在提供控制安卓设备的鼠标和按键映射,类似于游戏模拟器。

Scrcpy-mask 为了实现电脑控制安卓设备,本人使用 Tarui Vue 3 Rust 开发了一款跨平台桌面客户端。该客户端能够提供可视化的鼠标和键盘按键映射配置。通过按键映射实现了实现类似安卓模拟器的多点触控操作,具有毫秒级响应速度。该工具可广泛用于电脑控…

【算法】二分算法——寻找峰值

题解:寻找峰值(二分算法) 目录 1.题目2.暴力求解3.二分算法4.总结 1.题目 题目链接:LINK 2.暴力求解 暴力求解的思路很简单,这个数组的形状无非就三种: 一直上升下降(这里包含先下降后上升)先升后降 总结一下规律&#xff1…

智能AI愈发强大,企业如何防范AI网络钓鱼攻击

随着AI技术的快速发展,如ChatGPT等智能化工具在各个领域得到了广泛应用。然而,这些工具的普及也给网络安全带来了新的挑战。AI模型的自然语言生成功能使得网络钓鱼攻击更加智能化和隐蔽化,攻击者能够利用AI技术生成高度逼真的欺骗性邮件和其他…