深度学习设计模式之简单工厂模式

文章目录

  • 前言
  • 一、简单工厂设计模式的作用?
  • 二、详细分析
    • 1.核心组成
    • 2.实现步骤
    • 3.示例代码
    • 4.优缺点
      • 优点
      • 缺点
    • 5.使用场景
  • 总结


前言

本文主要学习简单工厂设计模式,这个设计模式主要是将创建复杂对象的操作单独放到一个类中,这个类就是工厂类,创建对象的时候由工厂类决定创建那个对象。
通俗理解工厂设计模式:工厂就是用来造东西的。


一、简单工厂设计模式的作用?

简单工厂模式又称“静态工厂方法”可以根据参数的不同返回不同类的实例,专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

二、详细分析

1.核心组成

  • Factory:工厂类,简单工厂模式的核心类。他提供决定实例化对象的统一方法。
  • IProduct:产品抽象类,简单工厂创建的所有对象的共同父类。
  • Product:具体产品类,简单工厂模式创建的目标对象。

在这里插入图片描述
其中ICar是产品抽象类,BMWCarToyotaCarSylphyCar都是具体的产品类;CarFactory是工厂类;FactoryTest则为测试类;

2.实现步骤

  • 创建抽象产品类,里面有产品的抽象方法,由具体的产品类去实现。
  • 创建具体产品类,继承了他们的父类,并实现具体方法。
  • 创建工厂类,提供了一个静态方法createXXX用来生产品,只需要传入你想实例化的产品名称,即可实例化对应产品;

3.示例代码

抽象产品类

/**
 * 抽象产品类
 */
public interface ICar {

    /**
     * 购买汽车
     */
    void buyCar();

}

具体产品类:

/**
 * 具体的产品类
 */
public class BMWCar implements ICar{
    @Override
    public void buyCar() {
        System.out.println("购买宝马汽车");
    }
}

/**
 * 具体的产品
 */
public class ToyotaCar implements ICar{
    @Override
    public void buyCar() {
        System.out.println("购买丰田汽车");
    }
}
/**
 * 具体产品类
 */
public class SylphyCar implements ICar{
    @Override
    public void buyCar() {
        System.out.println("购买轩逸汽车");
    }
}

工厂类

/**
 * 工厂类
 */
public class CarFactory {

    /**
     * 工厂方法
     * @param type
     * @return
     */
    public ICar createBuyCar(String type){
        if(type.equals("BMW")){
            return new BMWCar();
        }else if(type.equals("Toyota")){
            return new ToyotaCar();
        }else if(type.equals("Sylphy")){
            return new SylphyCar();
        }
        return null;
    }

}

测试类

    public static void main(String[] args) {
        CarFactory factory = new CarFactory();
        ICar car = factory.createBuyCar("BMW");
        car.buyCar();
    }

结果
在这里插入图片描述

4.优缺点

优点

  • 将创建对象和使用对象进行分离,使用者不关心对象的创建逻辑,实现了解耦。
  • 每个产品创建都是单独的类进行维护,这样后续的扩展或修改更简单。

缺点

  • 工厂类集成了所有产品的创建,一旦工厂类出现问题,则会影响所有的产品创建。
  • 一旦新增产品,就得对工厂类进行修改,违背了 “开闭原则”

5.使用场景

  • 职责分离:当客户只关注于类的使用,而不关心类的创建的时候。
  • 如果对象创建复杂且多处需用到的时候使用,这样就可以复用代码,同时当业务逻辑发生修改的时候,只需要修改一处即可。

总结

本文主要介绍了简单工厂设计模式提供了简单的代码示例。切记使用的过程中不要为了设计模式而设计模式,因场景而定,对于比较简单的场景,不使用设计模式将会更简单实现。过于依赖使用工厂设计模式将会创建更多的类,不利于代码结构的维护。

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

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

相关文章

详述进程的地址空间

进程的地址空间 合法的地址 (可读或可写) 代码 (main, %rip 会从此处取出待执行的指令),只读数据 (static int x),读写堆栈 (int y),读写运行时分配的内存 (???),读写动态链接库 (???) 非法的地址 NULL,导致 se…

Gooxi发布最新AI服务器:加速生成式AI落地 更懂AI

近日,Gooxi发布最新训推一体AI服务器,以大容量内存和灵活的高速互连选项满足各种AI应用场景,最大可能支持扩展插槽,从而大幅提升智能算力性能,以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AI…

FSMC的NOR Flash/PSRAM 控制器功能介绍(STM32F4)

目录 概述 1 FSMC支持的类型 1.1 信号类型概述 1.2 FSMC的应用 2 外部存储器接口信号 2.1 I/O NOR Flash 2.2 PSRAM/SRAM 3 支持的存储器和事务 4 通用时序规则 5 NOR Flash/PSRAM 控制器异步事务 5.1 模式 1 - SRAM/PSRAM (CRAM) 5.2 模式 A - SRAM/PSRAM (CRAM…

GPU Burn测试指导

工具下载链接: https://codeload.github.com/wilicc/gpu-burn/zip/master测试方法: 上传工具到操作系统下,解压缩工具,使用make命令完成编译(确保cuda环境变量已经配置成功、 nvcc -v能显示结果)。 如果安…

图扑智慧农业——生态鱼塘数字孪生监控

智慧农业园作为新型农业经营模式,正在以其高效、环保、可持续的特点受到广泛关注。智慧鱼塘作为智慧农业中一项关键技术,结合物联网、人工智能、云计算等技术,实现对新型养殖模式的实时监控、优化与管理。 效果展示 图扑软件应用自研 HT for…

CVE-2024-4761 Chrome 的 JavaScript 引擎 V8 中的“越界写入”缺陷

分析 CVE-2024-4761 和 POC 代码 CVE-2024-4761 描述 CVE-2024-4761 是一个在 V8 引擎中发现的越界写漏洞,报告日期为 2024-05-09。这个漏洞可能允许攻击者通过特制的代码执行任意代码或者造成内存破坏,进而导致程序崩溃或其他不安全行为。 POC 代码解…

群辉部署小雅alist实现视听盛会

最近群辉搭建起来了,开始整蛊影视库,之前搞过nastool。这次折腾下小雅alist。 1.下载并安装 直接在群辉的docker里面下载映像 主要映射下端口和文件夹 #token mytoken.txt 获取地址:https://alist.nn.ci/zh/guide/drivers/aliyundriv…

IBM Granite模型开源:推动软件开发领域的革新浪潮

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

01基础篇

1、初识 JVM 1.1 什么是 JVM JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 Java源代码执行流程如下: 分为三个步骤: 编写Java源代码文件。使用…

【Linux】线程机制解析:理解、优势与Linux系统应用

文章目录 前言:1. 线程概念1.1. 什么是线程1.2. 线程得优点:1.3. 线程的缺点线程异常线程的用途 2. 线程的理解(Linux 系统为例)2.1. 为什么要设计Linux“线程"?2.2. 什么是进程?2.3. 关于调度的问题2…

基于EBAZ4205矿板的图像处理:11阈值系数可调的图像局部阈值二值化

基于EBAZ4205矿板的图像处理:11阈值系数可调的图像局部阈值二值化 没写完,局部阈值二值化算法本身和算法的fpga部署思路没有讲,有空时补充 先看效果 还是一样拿我的pynq当模特,然后用usb——HDMI采集卡把输出图像采集到电脑上。…

每日一题12:Pandas:数据重塑-融合

一、每日一题 解答: import pandas as pddef meltTable(report: pd.DataFrame) -> pd.DataFrame:reshaped_report report.melt(id_varsproduct, var_namequarter, value_namesales)return reshaped_report 题源:Leetcode 二、总结 melt()函数是Pa…

为什么需要使用SOCKS5代理?

SOCKS代表Socket Secure,是一种网络协议,能够在网络上进行数据传输。SOCKS5是SOCKS协议的第五个版本,它提供了更加安全和灵活的数据传输方式,因此在网络安全和隐私保护方面被广泛应用。在我们的日常生活中,为什么需要使…

2024年5月13号刷题相关事项个人总结

01.01.03 LeetCode 入门及攻略(第 01 ~ 02 天) 1. LeetCode 是什么 「LeetCode」 是一个代码在线评测平台(Online Judge),包含了 算法、数据库、Shell、多线程 等不同分类的题目,其中以算法题目为主。我们…

jar包安装成Windows服务

一、前言 很多年前写过一篇《使用java service wrapper把windows flume做成服务》的文章,也是把jar包安装成windows服务,今天介绍另外一种更简便的方案。 二、正片 这次使用的工具是 winsw,一个Windows服务包装器。下面看详细介绍 首先从g…

开源禅道zentao的使用

很不幸禅道因为漏洞被人进攻了,被迫研究。 1.安装 直接使用docker进行部署,这里有非常多门道。官网的镜像easysoft-zentao是属于docker安装,而idoop的镜像虽然也是docker安装,但是实际是使用官网linux一键安装的版本&#xff0c…

默认成员函数:析构、深浅拷贝

析构函数 析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。 特性 析构函数名时在类名前面加上字符~ class D…

国产华为设备:NAT地址转换实验

NAT地址转换实验 实验背景: 由于IPV4地址紧缺,企业内部一般都使用私有IP地址,然而,企业客户需要不定期访问公司内网,同时部分企业还会对外提供相应服务,此时需要配置NAT来实现这些需求。 实验目的&#xff…

WD—C++课前作业—30题

怎么会手和脚都在桌子上 目录 31,声明一个类 String,其数据成员为 char head[100],构造函数 String(char*Head)实现 head 的初始化,成员函数 void reverse()实现 head 内字符串的逆序存放,成员函数 void print()实现 head 内字符串的输出。…

第15节 编写shellcode加载器

我最近在做一个关于shellcode入门和开发的专题课👩🏻‍💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考…