当前位置: 首页 > news >正文

设计模式—创建型模式之工厂模式

设计模式—创建型模式之工厂模式

工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。

简单工厂模式

比如我们有造车的工厂,来生产车,我们先定义一个抽象车产品:

//抽象车产品类
public abstract class AbstractCar { String engine;public abstract void run();
}

我们有两个具体的产品,货车和家用小汽车,都继承自抽象车:

//货车
public class Truck extends AbstractCar{public Truck() {this.engine = "货车引擎";}@Overridepublic void run() {System.out.println(this.engine+"--->正在运行");}
}
//家用小汽车
public class MiniCar extends AbstractCar{public MiniCar() {this.engine = "家用小汽车引擎";}@Overridepublic void run() {System.out.println(this.engine + "----------》正在运行");}
}

那我们的工厂可以如此定义:

public class MySimpleFactory {/*** 获取车* @param type* @return*/public AbstractCar newCar(String type){if("truck".equals(type)){return new Truck();}else if("mini".equals(type)){return new MiniCar();}return null;}
}

一般简单工厂生产的产品优先。

测试类如下:

public class SimpleFactoryTest {public static void main(String[] args) {MySimpleFactory factory = new MySimpleFactory();AbstractCar truck = factory.newCar("truck");AbstractCar mini = factory.newCar("mini");truck.run();mini.run();}
}

运行如下:

运行效果

缺点

**违反了开闭原则,扩展不易。**如果有大量的产品,会有大量的if else。

工厂方法模式

因为简单工厂模式,会出现大量的if else,并不能满足打开扩展、关闭修改的原则,我们希望,如果有扩展,直接扩展一个类就好,不区改动创造类型的代码,这样工厂方法模式就出现了。我们可以把工厂再进行抽象,把我们的工厂提升一个层次。

抽象类或者接口,就会有多个实现;有多实现 就会有多功能。

抽象工厂如下:

public abstract class AbstarctCarFactory {public abstract AbstractCar newCar();
}

我们的货车、小汽车,分别由不同的工厂来创建:

//货车工厂
public class TruckFactory extends AbstarctCarFactory {@Overridepublic AbstractCar newCar() {return new Truck();}
}
//小汽车工厂
public class MiniCarFactory extends AbstarctCarFactory {@Overridepublic AbstractCar newCar() {return new MiniCar();}
}

测试类如下:

public class FactoryMethodTest {public static void main(String[] args) {AbstarctCarFactory miniCarFactory = new MiniCarFactory();AbstractCar miniCar = miniCarFactory.newCar();miniCar.run();TruckFactory truckFactory = new TruckFactory();AbstractCar truck = truckFactory.newCar();truck.run();}
}

运行结果如下:

运行结果

这样,如果我们有新的类型,可以直接继承这个抽象工厂即可。

缺点

系统复杂度增加,可创建的品类单一。

抽象工厂模式

我们先来区分两个概念:

  • 产品等级:比如手机可以分为低配版手机、高配版手机;产品等级结构即产品的继承结构,如抽象类为手机,可以有拍照手机、游戏手机等等。
  • 产品族:产品可以分为手机、汽车等,这是产品族。在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。

在车的产品基础上,我们又增加了新的产品,手机。

public abstract class AbstractPhone {//手机类型String type;public abstract void run();
}public class GamePhone extends AbstractPhone {public GamePhone() {this.type = "游戏手机";}@Overridepublic void run() {System.out.println(this.type + "正在运行了...");}
}public class MyPhotoPhoneFactory implements MyAbstarctFactory{@Overridepublic AbstractPhone newPhone() {return new PhotoPhone();}
}

如果我们想生产车和手机,我们可以定义抽象工厂:

public interface  MyAbstarctFactory {default AbstractCar newCar(){return null;}default AbstractPhone newPhone(){return null;}
}

生产手机的工厂分别为:

public class MyGamePhoneFactory implements MyAbstarctFactory{@Overridepublic AbstractPhone newPhone() {return new GamePhone();}
}
public class MyPhotoPhoneFactory implements MyAbstarctFactory{@Overridepublic AbstractPhone newPhone() {return new PhotoPhone();}
}

生产车的工厂分别为:

public class MyMiniCarFactory implements MyAbstarctFactory{@Overridepublic AbstractCar newCar() {return new MiniCar();}
}public class MyTruckCarFactory implements MyAbstarctFactory{@Overridepublic AbstractCar newCar() {return new Truck();}
}

测试类如下:

public class MyTest {public static void main(String[] args) {MyAbstarctFactory factory = new MyGamePhoneFactory();AbstractPhone abstractPhone = factory.newPhone();abstractPhone.run();factory = new MyMiniCarFactory();AbstractCar abstractCar = factory.newCar();abstractCar.run();}
}

运行如下:

运行结果

可以看到,我们在扩展时,都是新增类,而不是修改原有的方法。

相关文章:

设计模式—创建型模式之工厂模式

设计模式—创建型模式之工厂模式 工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。 简单工厂模式 比如我们有造车的工厂,来生产车,我们先…...

N.B.缩略语的意思

阅读文献的时候,经常遇到N.B.这个缩略语,是表示“注意”的意思,它是nota bene的缩写,是拉丁短语。 例如: N.B. all Values are Hexadecimal...

SpringBoot源码透彻解析—自动装配

花点时间找到程序入口: 整个自动装配的流程总结如下: bean工厂后置处理器(ConfigurationClassPostProcessor) 扫描spring.factories和spring-autoconfigure-metadata.properties两个文件,将文件中的自动装配类信息抽象成Con…...

基于springboot实现疫情防控期间外出务工人员信息管理系统项目【项目源码+论文说明】

基于springboot疫情防控期间外出务工人员信息管理系统 摘要 网络的广泛应用给生活带来了十分的便利。所以把疫情防控期间某村外出务工人员信息管理与现在网络相结合,利用java技术建设疫情防控期间某村外出务工人员信息管理系统,实现疫情防控期间某村外出…...

自动曝光算法(第一讲)

序言 失业在家无事,想到以后换方向不做自动曝光了,但是自动曝光的工作经验也不能浪费了,准备写一个自动曝光的教学,留给想做自动曝光的小伙伴参考。笔者当时开发自动曝光没有按摄影的avtvevbvsv公式弄,而是按正确的增…...

QStandardItemModel,setData和setItem区别

背景: model存储数据,用于同步view显示。数据节点全部是item。对象树结构。但是一些常用的函数的特征和用法,手册中没有提及太多,于是记录备忘。 主要包括: setRowCount,setColumnCount setItem&#x…...

应用出海新福祉,融云助IM社交迅速对齐海外用户体验

对于互联网业务而言,贴近年轻用户的创新是永恒的话题。近期,一种新的社交方式悄悄地在年轻人中流行开来,这就是“猫鼠游戏”。关注【融云全球互联网通信云】了解更多 玩法可以说是我们熟悉的“躲猫猫”游戏升级版,不同之处在于&a…...

64T存储松下mov和索尼mp4文件变0字节恢复案例

64T存储松下mov和索尼mp4文件变0字节恢复案例 小型入门的小NAS凭借超市的性价比在各行业中开始流行,可以通过搭配普通SATA硬盘就可以完成阵列上线,部署也很简单,一根网线就搞定。我们看一个影视公司64T小NAS存储比较奇怪的恢复案例。 故障存…...

【C/C++】 常量指针、指针常量、指向常量的常指针

const修饰指针的三种情况 int main() {int a 10;int b 10;//常量指针//const修饰的是int,指针指向可以改,指针指向的值不可以更改const int * p1 &a; p1 &b; //正确//*p1 100; 报错//指针常量//const修饰的是指针,指针的值&am…...

容斥原理,多步容斥

容斥意义法 设计状态表示容斥的过程。比较简单的容斥题目一般可以容斥意义。 如果我们要求方案数的话,通常情况下我们的把限制视为两个方面,一方面是总限制,一方面是对于每个物品的限制,这样设集合 S i S_i Si​表示满足总限制以及…...

vue(32) : win10创建vue2基础前端框架

vue2element-uiaxios 1.创建vue2项目 开发工具为HBuilderX 3.7.3 1.1.新建项目 1.2.普通项目-vue项目(2.6.10) 等待创建项目 2.安装element-ui组件 2.1右键左下角开始图标 2.2.cd进入项目目录,执行安装element-ui npm i element-ui -S 2.3.main.js引入配置 import {Paginat…...

如何制作一款资源网站app

简介 平时生活学习中我们会经常登录各种网站,比如看电影,看视频学习,找资料等等。有时想找到一个靠谱的网站,花了很长时间也找不到。我自己收集了很多好的网站,主要是找资源的,然后我做了一个导航app软件&…...

解决在Win7下运行一些老游戏花屏或色彩异常问题的方法

有一些喜欢回顾经典老游戏的玩家们,在目前最新的windows7的操作系统下,运行某些游戏会出现花屏,问题的原因是因为win7对这些游戏的DirectDraw不兼容,一种方法是改游戏配置文件,把游戏色彩8bit改成16bit,当然…...

使用vue3+vite+elctron构建小项目介绍Electron进程间通信

进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应用程序的关键部分之一。 由于主进程和渲染器进程在 Electron 的进程模型具有不同的职责,因此 IPC 是执行许多常见任务的唯一方法,例如从 UI 调用原生 API 或从原生菜单触发 Web 内容的更改。 在 …...

家政APP开发服务同城预约维修接单管理系统软件小程序

家政服务小程序是一个基于移动端的家政服务平台,为用户提供方便快捷的家政服务。以下是小程序的主要功能: 1. 家政服务内容展示:商家可以在小程序中展示各种家政服务项目,如清洁、保洁、保姆、月嫂、钟点工等。用户可以浏览服务信…...

NOIP2023模拟8联测29 C. 蛋糕

NOIP2023模拟8联测29 C. 蛋糕 文章目录 NOIP2023模拟8联测29 C. 蛋糕题目大意思路code 题目大意 你现在得到了一个二维蛋糕,它从左到右可以分成 n n n 列,每列高为 a i a_i ai​ 。对于每一列,又可以从下到上分为 a i a_i ai​ 块&#x…...

echarts的图表立体感——实现立体柱状图和立体饼图的详细教程

😂博主:小猫娃来啦 😂文章核心:使用echarts实现立体柱状图和立体饼图的详细教程 文章目录 简单介绍立体柱状图和立体饼图环境配置实现立体柱状图实现立体饼图总结 简单介绍立体柱状图和立体饼图 立体柱状图和立体饼图是数据可视化…...

解决VSCode使用SSH远程连接时无法指定用户名的问题

Windows 11自带OpenSSH客户端,和VSCode配合得很好,没有这个问题。 今天要说的是旧版本Windows 7/8/10系统遇到的问题。 PS: Windows 7可以运行的最后版本是VSCode 1.80.2 由于Windows 7/8/10没有自带的OpenSSH客户端,但可以调用MSYS环境下的…...

Vue Camera是什么,如何用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一、Vue Camera是什么? Vue Camera是一个基于Vue.js的相机组件库,…...

ORANGE室内高尔夫—韩国室内模拟高尔夫原装进口真实体验身临其境

ORANGE室内高尔夫—韩国室内模拟高尔夫 真实体验 身临其境 室内高尔夫的产品优势: 1. 实际高尔夫球场的限制:室内高尔夫可以弥补室外高尔夫球场数量有限的问题,使得更多人能够享受高尔夫运动。 2. 天气和季节的限制:室内高尔夫可…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络&#xf…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...