Java知识复习(六)常见的设计模式(单例、原型、工厂)

news2024/9/29 18:13:53

前言

发现无论是什么设计模式,其实总的原则就是减少耦合,增加可复用代码,使系统更易于扩展
参考书籍:《秒懂设计模式》

1、单例模式(Singleton)

  1. 单例模式:即单一的实例,同时提供几种、统一的访问接口,以使行为保持协调一致
  2. 饿汉模式:即在初始阶段就主动进行实例化,并时刻保持一种渴求的状态,无论此单例是否有人使用。举例如下在这里插入图片描述
    详细说明:把单例设置为static、final,即一开始就创建实例和一旦被赋值就无法修改;然后构造方法私有化,不允许外人构造;但其他类可以通过公开的getInstance获取实例;
  3. 懒汉模式:其他同上,但是实例只有在被使用时才会被构建。举例如下:在这里插入图片描述
    详细说明:volatile关键字能保证变量值在各线程访问时的同步性和唯一性;synchronized是为了加同步锁,保证多线程并发下逻辑的准确性。

2、原型模式(Prototype)

  1. 原型模式:可以用对象创建对象,而不是用类创建对象,以此达到效率的提升。即可以直接复制现存的对象,而不用通过新建对象并一步步初始化来创建新对象。举例如下:
    在这里插入图片描述
    在这里插入图片描述
    详细说明:该类实现了java.lang包中的克隆接口Cloneable,并重写了克隆方法,如此一来外部就能够对本类的实例进行克隆操作,省去了由类而生的再造过程。
  2. 原型模式的类结构如下
    在这里插入图片描述

3、工厂方法模式(Factory Method)

1、简单工厂:把实例化和初始化的过程包装在一起,并可分类创建实例,但不易于扩展
在这里插入图片描述
客户端调用:调用简单工厂类即可创建不同的实例;
在这里插入图片描述
2、工厂方法:定义一个统一的接口,以确立统一的工业制造标准,并且易于扩展;工厂方法模式能将客户端与产品的实例化过程彻底解耦,而且可以更灵活地制造独特而多样的产品。
在这里插入图片描述
飞机工厂类
在这里插入图片描述
坦克工厂类
在这里插入图片描述
客户端调用:通过实例工厂类创建实例
在这里插入图片描述
3、工厂方法的类结构
在这里插入图片描述

4、抽象工厂模式(Abstract Factory)

1、抽象工厂模式:工厂方法模式在需要创建的产品变多时容易造成工厂泛滥,抽象工厂就是将产品进行规划整合,对现有工厂进行重构;其本质类似于对产品进行分类,通过整合抽象的分类来聚焦具体的产品
产品结构图在这里插入图片描述
兵种抽象类包含对兵种基础属性的描述
在这里插入图片描述
对兵种进行分类
在这里插入图片描述
创建人族具体兵种,分别扩展初级和中级兵种抽象类,兽族与人族类似
在这里插入图片描述
在这里插入图片描述
对生产线进行规划,创建统一的人类兵工厂
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
客户端调用
在这里插入图片描述
注意:这样看好像看不出来什么有什么好处,但对比工厂方法就知道了;假设我们要造3*3=9个兵种,使用工厂方法就需要使用九个具体兵种类并进行创建,但使用抽象工厂仅需要知道他们的分类,即兵种类别(人、兽、神)和兵种级别(初、中、高)即可创建;如果分类更多的话,抽象工厂就更能显现其好处

2、抽象工厂的类结构
抽象工厂通过“制造工厂的工厂”这样的方式,来决定具体让哪个工厂投入生产活动;
在这里插入图片描述

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

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

相关文章

【java web篇】项目管理构建工具Maven简介以及安装配置

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

【离线数仓-8-数据仓库开发DWD层-交易域相关事实表】

离线数仓-8-数据仓库开发DWD层-交易域相关事实表离线数仓-8-数据仓库开发DWD层-交易域相关事实表一、DWD层设计要点二、交易域相关事实表1.交易域加购事务事实表1.加购事务事实表 前期梳理2.加购事务事实表 DDL表设计分析3.加购事务事实表 加载数据分析1.首日全量加购的数据加载…

基于APRX并行架构的高速QPSK解调实现(Matlab仿真篇)

由于QPSK系统下变频之后的信号中频为720MHz,信息符号速率为500Mbps,因此,采用传统的串行解调方案已无法在FPGA中实现解调。因此,本方案采用基于APRX并行架构实现对高速率的QPSK解调。如图1所示,为并行全数字QPSK接收机实现架构。 图1 并行全数字QPSK接收机实现架构 1 高速…

Golang 接口笔记

基本介绍接口是一个数据类型,可以定义一组方法,但都不需要实现。并且interface中不能包含任何变量。到某个自定义类型要使用的时候,再根据具体情况把这些方法实现出来语法type 接口名 interface {method1(参数列表) 返回值列表method2(参数列…

UG NX二次开发(C#)-CAM-点击插件自动进入CAM模块

文章目录 1、前言2、调用CAM模块错误2、进入加工模块1、前言 UG NX软件中CAM模块作为一个很重要的,也是其特别亮点的功能模块,能实现车、铣、磨、钻等加工工艺编程,但是由于其是通用性比较强,对于专业上的可能不能完全满足要求,这就要求我们在CAM模块下进行二次开发。我们…

操作系统核心知识点整理--进程篇

操作系统核心知识点整理--进程篇什么是系统调用进程篇什么是进程什么是线程从一次fork调用看linux进程和线程的本质区别小结用户级线程和内核级线程的区别进程的状态进程的切换进程调度并发问题死锁参考本文主要面向应用层软件开发人员整理一篇必须了解的操作系统核心知识图谱&…

maya多边形顶点变形批量传递方法

一、问题描述 做项目时,对于重复更改相同模型的顶点位置需要大量重复操作,maya默认提供了多边形属性传递的方法,如下图: 但一次只能执行一次,并且带有大量历史节点,此方式的好处是,可以实现实…

《零成本实现Web自动化测试--基于Selenium》 Selenium-RC

一. 简介 Selenium-RC可以适应更复杂的自动化测试需求,而不仅仅是简单的浏览器操作和线性执行。Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例,例如读写文件、查询数据库和E-mail邮寄测试报告。 当测试案例遇到selenium-IDE不支持的逻辑…

python的所有知识点+代码+注释,不看就亏死了

目录 简介 特点 搭建开发环境 版本 hello world 注释 文件类型 变量 常量 数据类型 运算符和表达式 控制语句 数组相关 函数相关 字符串相关 文件处理 对象和类,注:不是那个对象!!!!&…

HTML创意动画代码

目录1、动态气泡背景2、创意文字3、旋转立方体1、动态气泡背景 <!DOCTYPE html> <html> <head><title>Bubble Background</title><style>body {margin: 0;padding: 0;height: 100vh;background: #222;display: flex;flex-direction: colum…

SpringCloud————Eureka概述及单机注册中心搭建

Spring Cloud Eureka是Netflix开发的注册发现组件&#xff0c;本身是一个基于REST的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力。 Eureka组件的三个角色 服务中心服务提供者服务消费者 Eureka Server&#xff1a;服务器端。提供服务的注册和发现…

kubernetes 1.26.1 Etcd部署(外接)保姆级教程

目录 部署etcd前期准备 机器信息 升级内核 系统配置 部署容器运行时Containerd 安装crictl客户端命令 配置服务器支持开启ipvs的前提条件 安装 kubeadm、kubelet 和 kubectl 安装部署etcd 1.将 kubelet 配置为 etcd 的服务管理器 2.为 kubeadm 创建配置文件 3. 生成…

2023年网络安全某市赛竞赛任务书

竞赛任务书 一、竞赛时间 共计3小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 数据库服务渗透测试 100分钟 150 任务二 Windows操作系统渗透测试 200 任务三 Linux操作系统渗透测试 150 任务四 Web安…

【人工智能 AI】什么是人工智能? What is Artificial Intelligence

目录 Introduction to Artificial Intelligence人工智能概论 What is Artificial Intelligence? 什么是人工智能?

ProtoBuf介绍

1 编码和解码编写网络应用程序时&#xff0c;因为数据在网络传输的都是二进制字节码数据&#xff0c;在发送数据时进行编码&#xff0c;在接受数据时进行解码codec&#xff08;编码器&#xff09;的组成部分有2个&#xff1a;decoder&#xff08;解码器&#xff09;和encoder&a…

回归预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络数据回归预测

回归预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络数据回归预测 目录回归预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络数据回归预测效果一览基本介绍模型搭建程序设计参考资料效果一览 基本介绍 基于贝叶斯优化卷积双向长短期记忆网络(…

自动化测试整理 --- STAF/STAX Robot Framework

题记:上周花了点时间学习开源的自动化测试框架Robot Framework,结合自己之前的自动化经验&#xff0c;就想周末写篇文章整理下。 目前&#xff0c;所在项目的自动化测试框架是基于STAF/STAX的拓展&#xff0c;围绕STAX执行引擎&#xff0c;扩展了测试用例的创建、管理&#xf…

验证功能覆盖率收集时per_instance=1可能导致覆盖率线性增长

验证覆盖率收集时&#xff0c;发现coverage database达到了惊人的256G&#xff0c;如下&#xff1a; 进入database中的testdata目录下的用例定位发现&#xff0c;问题出在这个文件&#xff1a; testbench.inst.xml其大小基本等同于验证用例覆盖率的大小。 这个文件时怎么产…

C++函数新思想和标准的输入和输出

欢迎来观看温柔了岁月.c的博客目前设有C学习专栏C语言项目专栏数据结构与算法专栏目前主要更新C学习专栏&#xff0c;C语言项目专栏不定时更新待C专栏完毕&#xff0c;会陆续更新C项目专栏和数据结构与算法专栏一周主要三更&#xff0c;星期三&#xff0c;星期五&#xff0c;星…

【决策树】一文看懂图解决策树原理:信息熵、条件熵与信息增益

本文用过图解的方式并结合实际案例的方式讲述了决策树的基本原理&#xff0c;主要包含信息熵、条件熵与信息增益的概念与计算方式&#xff0c;以及如何选择各个决策节点&#xff08;即&#xff1a;选择信息增益最大的特征&#xff09;。 想要PDF文档的小伙伴&#xff0c;通过关…