设计模式学习笔记(二):工厂方法模式

news2024/11/17 23:46:11

一、定义

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方法。工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

二、分析


1.角色分析

  1. 抽象工厂类(Abstract Factory)

    • 定义了一个创建产品对象的操作接口,这个接口是工厂方法,返回的类型是一个抽象的产品类型。
    • 工厂方法可以由子类实现,以生成一组相关或相互依赖的对象。
  2. 具体工厂类(Concrete Factory)

    • 实现抽象工厂类中的工厂方法,生成一组具体对象。
  3. 抽象产品类(Abstract Product)

    • 为所有类型的产品对象声明一个通用接口。
    • 客户端通过使用这个通用接口来处理所有产品对象。
  4. 具体产品类(Concrete Product)

    • 实现抽象产品接口的具体类。
    • 工厂方法返回的具体产品对象,就是这些具体产品类的实例。

2.代码分析

此处代码为vue3+ts

<template>
  <div class="page">
    <div class="main">
      <div ref="mainContainer"></div>
    </div>
  </div>
</template>
<script setup lang="ts">
import { onMounted, ref } from "vue";
const mainContainer = ref<HTMLDivElement | null>(null);
// 抽象产品类
class AbstractDiv {
  element: HTMLDivElement | null;
  constructor() {
    this.element = document.createElement("div");
  }
  getElement() {
    if (this.element) return this.element;
    else return document.createElement("div");
  }
}
// 具体产品类 - RedDiv
class RedDiv extends AbstractDiv {
  setStyle() {
    if (!this.element) return;
    this.element.style.backgroundColor = "red";
    this.element.style.width = "100px";
    this.element.style.height = "100px";
    this.element.style.margin = "10px";
    this.element.style.display = "inline-block";
  }
}
// 具体产品类 - GreenDiv
class GreenDiv extends AbstractDiv {
  setStyle() {
    if (!this.element) return;
    this.element.style.backgroundColor = "green";
    this.element.style.width = "100px";
    this.element.style.height = "100px";
    this.element.style.margin = "10px";
    this.element.style.display = "inline-block";
  }
}

// 抽象工厂类
abstract class AbstractDivFactory {
  abstract createDiv(color: string): AbstractDiv;
}

// 具体工厂类 - ColorDivFactory
class ColorDivFactory extends AbstractDivFactory {
  createDiv(color: string) {
    let div;
    if (color === "red") {
      div = new RedDiv();
    } else if (color === "green") {
      div = new GreenDiv();
    } else {
      throw new Error(`暂不支持${color}色`);
    }
    div.setStyle(); // 在工厂内部直接调用setStyle方法
    return div;
  }
}
// 创建ColorDivFactory实例
const divFactory = new ColorDivFactory();

onMounted(() => {
  // 示例用法
  const container = mainContainer.value;
  // 创建并添加不同颜色的div到容器中
  const redDivInstance = divFactory.createDiv("red");
  const greenDivInstance = divFactory.createDiv("green");
  container?.appendChild(redDivInstance.getElement());
  container?.appendChild(greenDivInstance.getElement());
});
</script>
<style>
.page {
  width: 100%;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>

图片简单描述:

三、作用与优缺点

作用

  1. 封装对象的创建过程:工厂模式将对象的创建过程封装在工厂类中,用户只需调用工厂类提供的方法,而无需关心对象的具体创建细节。
  2. 降低耦合度:通过工厂模式,客户端代码与具体产品类之间的耦合度得到降低,使得代码更易于维护和扩展。
  3. 提高代码复用性:工厂模式中的工厂类可以复用,当需要创建相同类型的对象时,只需调用工厂类的方法即可,无需重复编写创建代码。
  4. 易于扩展和维护:当需要添加新的产品类时,只需在工厂类中添加相应的创建逻辑,而无需修改客户端代码,符合开闭原则。

优点

  1. 降低系统的耦合度:工厂模式通过将对象的创建过程集中到一个工厂类中来降低系统的耦合度,从而使得系统更加灵活、可扩展和易于维护。
  2. 隐藏对象的创建细节:工厂模式将对象的创建过程封装在工厂类中,对客户端隐藏了对象的创建细节,从而使得系统更加安全、稳定和简洁。
  3. 提高系统的灵活性:工厂模式可以在不修改已有代码的基础上,动态地添加、替换或删除产品对象,从而提高了系统的灵活性和可扩展性。

缺点

  1. 增加系统复杂性:工厂模式的引入可能会增加系统的复杂性,特别是当工厂类数量较多时,管理和维护这些工厂类可能会变得相对困难。
  2. 可能导致过度设计:在某些情况下,过度使用工厂模式可能导致设计过于复杂,甚至可能引入不必要的抽象和层级,使得代码难以理解和维护。
  3. 可能引入性能开销:由于工厂模式涉及到对象的创建和分配,可能会在一定程度上增加系统的性能开销,特别是在创建大量对象时。

参考资料

设计模式(第二版) 主编:刘伟  清华大学出版社

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

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

相关文章

大语言模型系列-GPT-3.5(ChatGPT)

文章目录 前言一、GPT-3.5的创新点二、GPT-3.5的训练流程SFT数据集RM数据集PPO数据集 三、ChatGPT的诞生总结 前言 《Training language models to follow instructions with human feedback&#xff0c;2022》 前文提到了GPT-3的缺点&#xff0c;其中最大的问题是&#xff1…

C++ 11 新特性 override和final

一.override和final介绍 在C11中&#xff0c;override和final是两个用于支持继承和多态的重要关键字。它们的具体作用如下&#xff1a; override&#xff1a;这个关键字用于派生类中&#xff0c;以确保虚函数的正确重写。当一个派生类的函数被声明为override时&#xff0c;编译…

【Ubuntu 20.04 / 22.04 LTS】最新 esp-matter SDK 软件编译环境搭建步骤

仓库链接&#xff1a;esp-matter SDK官方软件说明&#xff1a;ESP Matter Programming Guide官方参考文档&#xff1a;使用 Matter-SDK 快速搭建 Matter 环境 (Linux) 环境要求 Ubuntu 20.04 或 Ubuntu22.04网络环境支持访问 Gihub 在安装 esp-matter SDK 软件编译环境之前&a…

基于C++中netCDF库读取.nc数据时的一些坑

本文介绍基于C 语言的netCDF库读取.nc格式的栅格文件时&#xff0c;出现数据无法读取、数据读取错误、无法依据维度提取变量等情况的原因与解决方法。 最近&#xff0c;由于需要读取ERA5气象数据&#xff0c;因此使用C语言中的netCDF库读取.nc格式文件&#xff1b;这其中也是踩…

Docker基础教程 - 7 容器数据卷

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 7 容器数据卷 什么是容器卷&#xff0c;为什么需要容器卷&#xff1f; 我们在运行容器的时候&#xff0c;产生的数据都是保存在容器内部的。如果使用Docker来运行mysql容器&#xff0c;数据…

网络性能优化工具

网络优化是 IT 行业的一个重要方面&#xff0c;网络很复杂&#xff0c;管理员努力保持其平稳运行&#xff0c;然而&#xff0c;网络环境也是不可预测和动态的&#xff0c;任何未受监控的问题都可能像滚雪球一样变成中断。 优化网络性能需要引入&#xff1a; 新设备和应用程序…

Axure RP 10:让原型设计更快、更直观、更智能 mac版

Axure RP 10是一款强大的原型设计工具&#xff0c;它能够帮助设计师快速创建高保真、交互式的原型&#xff0c;从而更好地展示和测试设计方案。这款软件凭借其直观易用的界面和丰富的功能&#xff0c;已经成为了许多设计师的首 选工具。 Axure RP 10 for Mac版软件获取 首先&a…

还在使用 RESTful API ? 试一试 GraphQL

前言 GraphQL 和 RESTful API 是两种不同的网络通信接口设计理念&#xff0c;它们都可以用于客户端和服务器之间的数据交换&#xff0c;但是有着不同的工作方式和特点。 各自的特点以及优缺点 GraphQL&#xff1a; 特点&#xff1a; 查询语言: GraphQL 是一个查询语言&…

【MySQL 系列】MySQL 架构篇

在我们开始了解 MySQL 核心功能之前&#xff0c;首先我们需要站在一个全局的视角&#xff0c;来看 SQL 是如何运作执行的。通过这种方式&#xff0c;我们可以在头脑中构建出一幅 MySQL 各组件之间的协同工作方式&#xff0c;有助于我们加深对 MySQL 服务器的理解。 文章目录 1、…

DEYO: DETR with YOLO for End-to-End Object Detection论文翻译

DEYO&#xff1a;DETR与YOLO用于端到端目标检测 摘要 DETR的训练范式在很大程度上取决于在ImageNet数据集上预训练其骨干。然而&#xff0c;由图像分类任务和一对一匹配策略提供的有限监督信号导致DETR的预训练不充分的颈部。此外&#xff0c;在训练的早期阶段匹配的不稳定性会…

利用Cocos游戏开发中的跑马灯祝女神们节日快乐

点击上方亿元程序员+关注和★星标 引言 Cocos游戏开发中的跑马灯广播效果 大家好,今天是国际劳动妇女节,也就是我们如今熟知的女神节。 今天打算通过游戏开发中的跑马灯广播这最直接的方式祝女神们节日快乐! 跑马灯作为游戏中常见的UI元素,通常被用来展示重要的信息或者…

Gafana Redis Overview dashboard

1. 简介 根据提供的 Redis 监控仪表盘 JSON 文件,包含的监控指标及其简要描述如下: redis_uptime_in_seconds: Redis 实例的运行时间(秒)。 redis_connected_clients: 当前连接到 Redis 实例的客户端数量。 redis_memory_used_bytes: Redis 实例使用的内存量(字节)。 redis_m…

Qt + mqtt对接阿里云平台(一)

一、阿里云平台 官网&#xff1a;点击跳转 二、创建产品与设备 1、“公共实例” 2、“设备管理”->“产品”->“创建产品” 3、“产品名称”->“自定义品类”->"确认" 4、“前往添加” 5、“添加设备” 6、摄入DeviceName和备注名称 7、"前往查…

css-vxe-form-item中输入框加自定义按钮(校验位置错误)

1.浮动错误效果 提示内容不对 2.不使用浮动&#xff0c;使用行内块元素 代码如下 <vxe-form-item title"yoyo:" field"assembleWorkNo" span"8"><template #default><vxe-input style"width:70%;display:inline-block;&quo…

Linux之cd、pwd、mkdir 命令

cd命令&#xff0c;切换目录 1&#xff09;当Linux终端&#xff08;命令行&#xff09;打开的时候&#xff0c;会默认以用户的HOME目录作为当前的工作目录。 2&#xff09;我们可以通过cd命令&#xff0c;更改当前所在的工作目录。 3&#xff09;cd命令来自英文&#xff1a;C…

基于FPGA的PSRAM接口设计与实现

一 PSRAM与HyperRAM 1、概述 2、异同 待完善 二 PSRAM分析 1、特性 1、关键点 待完善 三 PSRAM方案设计与验证 待完善 1、整体方案设计 2、验证 仿真工具采用VCSVerdi&#xff0c;PSRAM接口控制IPAPS6408L model进行验证。 四 结论 备注&#xff1a;以AP公司的APS6408L…

IP传输方式——组播

组播作为IP传输三种方式之一&#xff0c;指的是报文从一个源发出&#xff0c;被转发到一组特定的接收者&#xff0c;相同的报文在每条链路上最多有一份。相较于传统的单播和广播&#xff0c;组播可以有效地节约网络带宽、降低网络负载&#xff0c;所以被广泛应用于IPTV、实时数…

mysql如何开启远程访问?

MySQL是一种常见的关系型数据库管理系统&#xff0c;广泛应用于各行各业。默认情况下&#xff0c;MySQL仅允许本地访问&#xff0c;即只能在本地主机上进行数据库操作。有时候我们需要通过远程连接访问MySQL数据库&#xff0c;以便实现更灵活的管理和操作。本文将介绍如何在MyS…

HTML静态网页成品作业(HTML+CSS)——原神介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

如何恢复未保存的Word文档

Microsoft Word 是世界上最流行的软件之一。它不仅是各行业提高生产力的利器&#xff0c;而且广泛应用于我们的日常生活中。因此&#xff0c;当您发现自己工作了数小时和数天的word doc文档被意外未保存、删除或丢失时&#xff0c;大多数人可能都知道恐慌和绝望。 今天我们将向…