【工厂模式与抽象工厂】—— 每天一点小知识

news2024/11/27 20:37:17

在这里插入图片描述

                                                                              💧 工厂模式与抽象工厂 \color{#FF1493}{工厂模式与抽象工厂} 工厂模式与抽象工厂💧          


🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录

  • 🐳工厂模式与抽象工厂
    • 工厂模式
      • 基本概念
      • 设计思想
      • 应用场景
      • 代码实现
    • 抽象工厂模式
      • 基本概念
      • 设计思想
      • 应用场景
      • 代码实现
    • 区别与联系
  • 🐳结语


🐳工厂模式与抽象工厂

      在软件开发中,工厂模式和抽象工厂模式是常用的创建型设计模式,它们都关注对象的创建,但在设计思想、应用场景和代码实现方式上有所不同。本文将深入探讨工厂模式和抽象工厂模式的基本概念、设计思想、应用场景以及它们之间的主要区别与联系。


工厂模式

基本概念

  💧工厂模式是一种创建型设计模式,它通过定义一个创建对象的接口,但将具体对象的创建延迟到子类中。工厂模式包括以下几个主要角色:

  • 抽象产品(Abstract Product):定义了产品的共同接口,可以是具体产品所实现的接口或抽象类。
  • 具体产品(Concrete Product):实现了抽象产品接口的具体类,是工厂模式中要创建的对象。
  • 抽象工厂(Abstract Factory):定义了创建产品的工厂接口,声明了工厂方法。
  • 具体工厂(Concrete Factory):实现了抽象工厂接口,负责具体产品的创建。

设计思想

  💧工厂模式的设计思想是将对象的实例化延迟到具体工厂中,从而实现对象的创建与使用的解耦。客户端只需要知道抽象工厂接口,而无需关心具体产品的创建过程。这样,如果需要添加新的产品类型,只需要创建对应的具体产品类和具体工厂类,无需修改客户端代码。

应用场景

  💧工厂模式适用于以下场景:

  • 当一个类无法预知要创建的对象的确切类别时,可以使用工厂模式将对象的创建逻辑封装在具体工厂中。
  • 当需要在运行时动态决定创建哪个具体产品时,可以使用工厂模式。

代码实现

  💧下面是一个简单的工厂模式示例代码,以创建不同形状的图形为例:

// 抽象产品
interface Shape {
    void draw();
}

// 具体产品
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Circle draw");
    }
}

class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Rectangle draw");
    }
}

// 抽象工厂
interface ShapeFactory {
    Shape createShape();
}

// 具体工厂
class CircleFactory implements ShapeFactory {
    @Override
    public Shape create
    Shape() {
        return new Circle();
    }
}

class RectangleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

// 客户端使用
public class Client {
    public static void main(String[] args) {
        ShapeFactory factory = new CircleFactory();
        Shape shape = factory.createShape();
        shape.draw();
    }
}

  💧在上述示例中,抽象产品为Shape接口,具体产品为CircleRectangle类。抽象工厂为ShapeFactory接口,具体工厂为CircleFactoryRectangleFactory类。客户端通过选择不同的具体工厂来创建不同的具体产品。


抽象工厂模式

基本概念

  💧抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象。抽象工厂模式包含以下几个主要角色:

  • 抽象产品族(Abstract Product Family):定义了一组相关产品的共同接口。
  • 具体产品族(Concrete Product Family):包含一组具体产品,实现了抽象产品族的接口。
  • 抽象工厂(Abstract Factory):定义了创建产品族的方法。
  • 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品族的对象。

设计思想

  💧抽象工厂模式的设计思想是提供一个接口,用于创建一系列相关的产品对象。客户端使用抽象工厂接口来创建产品对象,而无需关心具体产品的创建细节。这样可以确保创建的产品对象是相互关联和兼容的。

应用场景

  💧抽象工厂模式适用于以下场景:

  • 当需要创建一系列相互关联或相互依赖的产品对象时,可以使用抽象工厂模式。
  • 当希望一个系统独立于它的产品的创建、组合和表示时,可以使用抽象工厂模式。

代码实现

  💧下面是一个简单的抽象工厂模式示例代码,以创建不同操作系统下的按钮和文本框为例:

// 抽象产品族 - 按钮
interface Button {
    void render();
}

// 具体产品族 - Windows 按钮
class WindowsButton implements Button {
    @Override
    public void render() {
        System.out.println("Render Windows button");
    }
}

// 具体产品族 - Mac 按钮
class MacButton implements Button {
    @Override
    public void render() {
        System.out.println("Render Mac button");
    }
}

// 抽象产品族 - 文本框
interface TextField {
    void render();
}

// 具体产品族 - Windows 文本框
class WindowsTextField implements TextField {
    @Override
    public void render() {
        System.out.println("Render Windows text field");
    }
}

// 具体产品族 - Mac 文本框
class MacTextField implements TextField {
    @Override
    public void render() {
        System.out.println("Render Mac text field");
    }
}

// 抽象工厂
interface GUIFactory {
    Button createButton();
    TextField createTextField();
}

// 具体工厂 - Windows GUI
class WindowsGUIFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public TextField createTextField() {
        return new WindowsTextField();
    }
}

// 具体工厂 - Mac GUI
class MacGUIFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public TextField createTextField() {
        return new MacTextField();
    }
}

// 客户端使用
public class Client {
    public static void main(String[] args) {
        GUIFactory factory = new MacGUIFactory();
        Button button = factory.createButton();
        TextField textField = factory.createTextField();

        button.render();
        textField.render();
    }
}

  💧在上述示例中,抽象产品族包括ButtonTextField接口,具体产品族包括WindowsButtonMacButtonWindowsTextFieldMacTextField类。抽象工厂为GUIFactory接口,具体工厂为WindowsGUIFactoryMacGUIFactory类。客户端通过选择不同的具体工厂来创建相应操作系统下的按钮和文本框。


区别与联系

  • 工厂模式关注的是单个对象的创建,通过抽象工厂接口和具体工厂实现类之间的关系,封装了对象的创建过程。而抽象工厂模式关注的是一组相关对象的创建,通过抽象工厂接口和具体工厂实现类之间的关系,封装了一系列相关对象的创建过程。
  • 工厂模式的产品是单一的,每个具体工厂只创建一个具体产品。而抽象工厂模式的产品是相关的,每个具体工厂创建一组相关产品,保证了这些产品是相互关联和兼容的。
  • 工厂模式通过继承来实现具体产品的创建,每个具体产品对应一个具体工厂。而抽象工厂模式通过对象组合来实现具体产品族的创建,每个具体工厂对应一个具体产品族

  💧通过工厂模式和抽象工厂模式,我们可以更灵活地创建和组织对象,降低了客户端与具体产品的耦合度,提高了代码的可维护性和扩展性。


在这里插入图片描述


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

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

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

相关文章

数据库|TiDB多副本损坏,别着急!有损恢复帮你化险为夷!

高文锋 |后端开发工程师 目录 一、前言 二、TiDB数据库的存储架构 三、集群信息 (一)Store情况 (二)测试表db 1.sbtest 1的region分布情况 (三)模拟tikv出现故障 (四)有损不…

vue【过滤器】

目录 1:过滤器的基本语法 1.1:示例代码 1.2:注意事项 2:使用Vue.filter定义全局过滤器 2.1:私有过滤器 2.2:全局过滤器 3:使用全局过滤器格式化时间 3.1:处理如图的时间 3.…

接口测试异常场景耗时耗力?一文帮你解决

背景 随着前后端分离、微服务等技术的广泛应用,接口测试在整个测试过程中扮演的角色越来越重要,如何更加高效地把接口测好、测得更加充分就成了一个亟待解决的难题。 当前在对具体的某一接口进行测试时,普遍采取的方法是测试人员按照接口文…

Vue3使用Markdown编辑器并显示

安装markdown-it npm i kangc/v-md-editornext -S 在main.js中全局注册 import { createApp } from vueimport VueMarkdownEditor from kangc/v-md-editor; import kangc/v-md-editor/lib/style/base-editor.css; import vuepressTheme from kangc/v-md-editor/lib/theme/vu…

null 类对象

这篇文章有助于理解类与对象。类是一种类型&#xff0c;而对象则是一种类型的具体的东西了&#xff0c;即对象是要分配内存的。下面看一下很简单的例子 #include <stdio.h> #include <stdlib.h> #include <memory>class CTest { public:CTest(): mValue(100…

Axure教程—表格新增(中继器)

本文介绍的是用Axure中的中继器制作表格新增功能效果 效果 预览地址&#xff1a;https://ure09q.axshare.com 功能 用户点击“新增”出现表单&#xff0c;填写数据后保存数据。 制作 一、所需元件 矩形元件、中继器 二、制作过程 1、表格 拖入一个表格元件&#xff0c;表格…

go-zero的路由机制解析

构建web服务 参考官方教程go-zero安装 //安装goctl插件 go install github.com/zeromicro/go-zero/tools/goctllatest//加载go-zero依赖 go get -u github.com/zeromicro/go-zerolatestzero构建一个http服务器&#xff0c;基于goctl命令创建&#xff1a; goctl api new demo…

Redis 7 常用数据结构

10大数据结构图示 10大数据类型&#xff1a; redis字符串(String)redis列表(ist)redis哈希表(Hash)redis集合(Set)redis有序集合(ZSet)redis地理空间(GEO)redis基数统计(HyperLogLog)redis位图(bitmap)redis位域(bitfield)redis流(Stream) Redis键(key) 命令不区分大小写&am…

Burp代理单个站点

这里写自定义目录标题 Burp代理问题解决代理单个站点&#xff08;核心&#xff09; Burp代理问题 平时进行渗透的时候为浏览器挂上代理后往往全部站点都进行代理&#xff0c;有很多没用的包被抓到&#xff0c;影响测试&#xff0c;且和在burp上设置单个站点抓包比较麻烦。 解…

奥威BI云星空标准方案:部署快、一站式的SaaS BI解决方案

奥威BI云星空标准方案是一种基于奥威BI数据云&#xff08;SaaS平台&#xff09;的商业智能解决方案&#xff0c;提供一站式的销售管理、客户关系管理、人力资源管理、财务管理等业务流程。该方案提供了从数据连接、数据建模到数据分析与价值挖掘的全链路数据应用服务&#xff0…

[AJAX]使用fetch发送请求

fetch是浏览器原生的函数&#xff0c;不需要像原生AJAX新建实例就可以用于发送AJAX请求。 支持Promise获取异步的HTTP响应&#xff0c;和支持流式获取。 服务端代码 // 服务端准备 // 1、引入express const express require(express); // 2、创建应用对象 const app expre…

springcloud+docker+k8s发布脚本

项目结构如图&#xff1a; Dockerfile 文件 构建镜像&#xff1a; #基础镜像&#xff0c;如果本地仓库没有&#xff0c;会从远程仓库拉取 openjdk:8 FROM openjdk:8 #暴露端口 EXPOSE 9301 #容器中创建目录 RUN mkdir -p /usr/local/java #编译后的jar包copy到容器中创建到目录…

PyTorch的安装(ANACONDA+PyCharm)

文章目录 一、概念1.什么是PyTorch2.什么是ANACONDA3.什么是PyCharm 二、PyTorch的安装1.安装ANACONDA和PyCharm&#xff08;一路Next即可&#xff09;2.将ANACONDA与pycharm进行配置3.安装pytorch环境 一、概念 1.什么是PyTorch PyTorch是一个开源的机器学习框架&#xff0c…

软件测试需求分析方法

目录 前言&#xff1a; 1.1 什么是测试需求&#xff1f; 1.2 为什么要做测试需求&#xff1f; 2.测试需求分析方法 2.1 测试需求分析依据 2.2 测试需求架构划分 2.3 测试需求分析过程 2.3.1 测试需求收集 2.3.1.1 测试类型划分 2.3.1.2 测试类型细化 2.3.1.3 生成测…

华为OD机试真题 Python 实现【查找重复代码】【2023Q1 100分】

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出 一、题目描述 小明负责维护项目中的代码&#xff0c;需要查找出重复代码&#xff0c;用以支撑后续的代码优化&#xff0c;请你帮助小明找出重复的代码。 重复代码查找方法&#xff1…

高频前端面试题汇总之JavaScript篇

近期整理了一下高频的前端面试题&#xff0c;分享给大家一起来学习。如有问题&#xff0c;欢迎指正&#xff01; 前端面试题系列文章&#xff1a; 【1】「2021」高频前端面试题汇总之HTML篇 【2】「2021」高频前端面试题汇总之CSS篇 【3】「2021」高频前端面试题汇总之Java…

超详细,Pytest自动化测试框架 token全局设置-多套环境使用(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在做自动化测试时…

LAMP环境搭建

文章目录 LAMP环境搭建LAMP概述LAMP搭建安装Apache服务器安装mariadb(mysql)安装PHP PHP连接MySQLLAMP搭建论坛 LAMP环境搭建 LAMP概述 LAMP是一个常用的Web应用程序开发和部署平台&#xff0c;它是由以下四个开源软件的首字母组成&#xff1a; Linux&#xff08;操作系统&a…

【开发问题】sqlserver怎么开启cdc

怎么开启 执行sql1、创建cdc​2.如上执行完毕之后&#xff0c;会在<database_name>数据库下的“系统表”中创建如下六个系统表&#xff1a;3.验证SQLServer库级别CDC是否启用4.启用SQLServer表级别CDC功能&#xff08;针对某一张表&#xff09;5、验证SQLServer表级别是否…

计算机毕业论文内容参考|基于微信小程序和云开发的小区垃圾分类知识手册平台的设计与实现

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势相关技术与方法介绍系统分析总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于微信小程序和云开发的小区垃圾分类知识手册平台的设计与实现 摘要 本文介绍了基于微信小程序和云开发的小区垃圾分类知识手…