黑马-设计模式-笔记(未完)

一、基础

UML类图

可见性:

  • + public
  • - private
  • #protected
    表示方式:
  • 属性:可见性 名称:类型[=默认值]
  • 方法:可见性 名称(参数)[:返回类型]
    关系:
  • 关联关系:实线,引用关系,类属性里有另一个类
  • 聚合关系:空心菱形,表示整体和部分,类属性是另一个类的集合
  • 组合关系:实心菱形,强烈聚合关系,类属性是另一个类,控制它的存在
  • 依赖关系:虚线,类方法参数里有另一个类,(耦合度最低)
  • 继承关系:空心实线三角,泛化关系,表示一般与特殊,(耦合度最高)
  • 实现关系:空心虚线三角,接口和实现类关系
软件设计原则

单一职责原则:一个类只负责一个职责
里氏代换原则:子类可以直接替换父类,可以扩展父类的方法,但不能改变父类原有功能
开闭原则:对扩展开放,对修改关闭,实现热插拔
依赖倒转原则:模块间要依赖抽象,不要依赖实现,客户和实现解耦
接口隔离原则:接口最小粒度设计,一个类对另一个类尽量少依赖不相关的方法,抽象接口细拆开进行实现
迪米特法则:两个模块无需直接通讯就无需直接调用,使用第三方转发降低耦合度
合成复用原则:尽量先使用关联关系实现,其次才是继承复用,父类对子类是透明的(白箱复用)

一、创建型模式

如何创建对象,将对象的创建和使用分离

1.单例模式
结构
  • 单例类:只能创建一个实例的类
  • 访问类:使用单例类
分类
  • 饿汉式:类加载就会导致该单例对象被创建
    静态变量方式
public class Singleton {  
  
    // 1.私有构造方法  
    private Singleton() {}  
  
    // 2.在本类中创建该类对象  
    private static Singleton instance = new Singleton();  
  
    // 3.提供公共访问方式  
    public static Singleton getInstance() {  
        return instance;  
    }  
}

静态代码块方式

public class Singleton {  
  
    // 1.私有构造方法  
    private Singleton() {}  
  
    // 2.声明Singleton类型变量  
    private static Singleton instance; // null  
  
    // 3.静态代码块赋值  
    static {  
        instance = new Singleton();  
    }  
  
    // 4.提供公共访问方式  
    public static Singleton getInstance() {  
        return instance;  
    }  
}

枚举方式
枚举类线程安全只会装载一次,唯一不会被破坏的单例模式

public enum Singleton {  
    INSTANCE;  
}
  • 懒汉式:首次使用对象时才被创建
    方式一:判断并加锁
public class Singleton {  
  
    // 1.私有构造方法  
    private Singleton() {}  
  
    // 2.声明Singleton类型变量  
    private static Singleton instance;  
  
    // 3.提供公共访问方式  
    public static synchronized Singleton getInstance() {  
        // 判断instance是否为null  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

方式二:双重检查锁 写操作才加锁优化性能

public class Singleton {  
  
    // 私有构造方法  
    private Singleton() {}  
  
    // 声明对象 需要volatile保证有序性
    private static volatile Singleton instance;
  
    // 对外提供方法  
    public static Singleton getInstance() {  
        // 第一次判断  
        if (instance == null) {  
            synchronized (Singleton.class){  
                // 第二次判断  
                if (instance == null) {  
                    instance = new Singleton();  
                }  
            }  
        }  
  
        return instance;  
    }  
}

方式三:静态内部类
JVM加载时不会加载内部类,只有调用内部类时才会加载

public class Singleton {  
  
    // 私有构造方法  
    private Singleton() {}  
  
    // 定义一个静态内部类  
    // JVM加载时不会加载内部类,只有调用内部类时才会加载  
    private static class SingletonHolder{  
        // 在内部类中声明并初始化外部类的对象  
        private static final Singleton INSTANCE = new Singleton();  
    }  
  
    // 对外提供方法  
    public static Singleton getInstance() {  
        return SingletonHolder.INSTANCE;  
    }  
}
问题
  • 破坏单例模式
    • 序列化、反序列化:通过ObjectOutStream和ObjectInputStream对对象进行反序列化生产新的对象
      • 解决方法:在单例类中增加readResolve()方法返回单例对象
    • 反射:通过反射获取无参构造函数并放权
      • 解决方法:在单例类无参构造方法中增加判断并返回单例对象
2.工厂模式
简单工厂模式/静态工厂模式

把对象创建和业务分开,有新产品只需要修改工厂类;但是产品和工厂还有耦合,新产品还需要改工厂违反开闭

组成
  • 具体工厂:提供了创建产品的规范,调用者通过该方法创建产品
  • 抽象产品:定义产品规范
  • 具体产品:实现或继承抽象产品的子类
    ![[20240424_设计模式 GoF_1.png]]
工厂方法模式

用户只需知道具体工厂名称;新增产品只需添加具体产品和具体工厂类,无需对原工厂修改;但是增加了系统复杂

组成
  • 抽象工厂:提供创建产品的接口,调用者通过它访问具体工厂来创建产品
  • 具体工厂:提供了创建产品的规范,调用者通过该方法创建产品
  • 抽象产品:定义产品规范
  • 具体产品:实现或继承抽象产品的子类
    在这里插入图片描述
抽象工厂模式

可以保证用户使用同一个产品族的产品;但是产品族加一个产品,所有工厂类都需要修改

组成
  • 抽象工厂:提供创建产品的接口,包含多个创建产品的方法,创建多个不同等级的产品
  • 具体工厂:提供了创建产品的规范,调用者通过该方法创建产品
  • 抽象产品:定义产品规范
  • 具体产品:实现或继承抽象产品的子类
    ![[20240424_设计模式 GoF_2.png]]
3.原型模式

用一个已创建的实例为原型创建新对象,适用于对象创建复杂,对性能安全有要求

浅克隆:非基本类型指向原有内存地址
深克隆:完全一致并独立的拷贝,可以使用序列化或者递归浅克隆或其他方式实现

组成
  • 抽象原型类:规定了具体原型对象必须实现的clone方法,通常是Cloneable接口
  • 具体原型类:实现抽象原型类的clone方法
  • 访问类:使用具体原型类的clone方法来复制新对象
4.建造者模式

将复杂对象的构建和表示分离,使同样的构建可以创建不同的表示
适用于构建复杂且各个部分独立,构建流程相对一致的
可以通过内部建造类实现链式编程

组成
  • 抽象建造者类:接口规定都有哪些部分要创建
  • 具体建造者类:实现抽象建造者,提供具体构建各个部分的方法,完成后提供产品实例
  • 产品类:要创建的复杂对象
  • 指挥者类:调用具体建造者创建各个部分,只负责按顺序或完整创建
    在这里插入图片描述

二、结构型模式

如何将类或对象按布局组成更大的结构

1.代理模式

访问对象不直接引用目标对象;有静态代理(编译时生成)和动态代理(java运行时动态生成 JDK代理、CGLib代理)

组成
  • 抽象主题类:通过接口或抽象类声明真实主题和代理对象的业务方法
  • 真实主题类:实现具体业务,是代理对象代表的真实对象,是最终要引用的对象
  • 代理类:提供了与真实主题相同的接口,内部是对真实主题引用
静态代理

直接在代理类中增加真实主题类的成员变量,在方法中调用真实主题类的成员变量
在这里插入图片描述

JDK动态代理

java中提供动态代理类Proxy,里面有静态方法newProxyInstance获取代理对象

2.适配器模式
3.桥接模式
4.装饰者模式
5.外观模式
6.享元模式
7.组合模式

三、行为型模式

如何让类或对象协作完成任务

1.模板方法模式
2.策略模式
3.命令模式
4.职责链模式
5.状态模式
6.观察者模式
7.中介者模式
8.迭代器模式
9.访问者模式
10.备忘录模式
11.解释器模式

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

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

相关文章

CUDA的应用场景

CUDA的应用场景随着技术的发展不断扩展,其核心优势在于能够显著提高并行计算任务的处理速度,这对于任何需要处理大量数据和执行复杂计算的领域都是极其有价值的。CUDA开发的应用场景非常广泛,主要得益于其强大的并行计算能力,以下…

【软考】UML中的关系

目录 1. 说明2. 依赖3. 关联4. 泛化5. 实现 1. 说明 1.UML中有4种关系:依赖、关联、泛化和实现2.这 4种关系是 UML,模型中可以包含的基本关系事物。它们也有变体,例如,依赖的变体有精化、跟踪、包含和延伸 2. 依赖 1.依赖(Dependency)。2.…

代码随想录刷题随记27-贪心1

代码随想录刷题随记27-贪心 455.分发饼干 leetcode链接 class Solution {public int findContentChildren(int[] g, int[] s) {//boolean used[]new boolean [s.length];Arrays.sort(s);Arrays.sort(g);int index0;int ret0;for(int i0;i<g.length;i){while(index<s.…

MySQL--表的操作

目录 创建表 查看表结构 修改表 新增列 修改列类型 修改列名 修改表名&#xff1a; 删除列 删除表 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引…

【Entity Framework】聊一聊EF如何使用数据库函数

【Entity Framework】聊一聊EF如何使用数据库函数 文章目录 【Entity Framework】聊一聊EF如何使用数据库函数一、数据库函数的类型二、内置函数与用户定义的函数四、聚合函数、标量函数和表值函数五、Niladic函数六、EF Core 中的数据库函数映射6.1 内置函数映射6.2 EF.Functi…

请编写一个函数void fun(char*ss),其功能是:将字符串ss中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

mPEG-Dansyl,Methoxy PEG Dansyl由甲氧基-聚乙二醇(mPEG)和丹磺酰氯(Dansyl)两部分组成

【试剂详情】 英文名称 mPEG-Dansyl&#xff0c;Methoxy PEG Dansyl 中文名称 聚乙二醇单甲醚丹磺酸酯&#xff0c;甲氧基-聚乙二醇-丹磺酰胺 外观性状 由分子量决定&#xff0c;液体或者固体 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k&#xff0c;3.4k…

Fisher 准则分类

目录 一、什么是Fisher 准则 二、具体实例 三、代码实现 四、结果 一、什么是Fisher 准则 Fisher准则&#xff0c;即Fisher判别准则&#xff08;Fisher Discriminant Criterion&#xff09;&#xff0c;是统计学和机器学习中常用的一种分类方法&#xff0c;由统计学家罗纳…

JuliaImages教程(二):图像分割

1、介绍 图像分割是将图像划分为具有相似属性的区域的过程。图像分割具有多种应用&#xff0c;例如医学图像分割、图像压缩&#xff0c;并用作对象检测和光流等更高级别视觉任务中的预处理步骤。该包是用 Julia 编写的图像分割算法的集合。 2、安装 Pkg.add("ImageSegm…

软件测试面试题(二)

Web 测试.web 测试描述用浏览器访问 www.baidu.com 的过程以京东首页为例&#xff0c;设计用例框架。&#xff08;注意框架设计逻辑&#xff0c;区域划分&#xff0c;专项测试等&#xff0c;不需 要详细用例&#xff0c;需要查看 PC 可直接和辨识管提要求&#xff09;如何测试购…

Java Web 网页设计(1)

不要让追求之舟停泊在幻想的港湾 而应扬起奋斗的风帆 驶向现实生活的大海 网页设计 1.首先 添加框架支持 找到目录右键添加 找到Web Application选中 点击OK 然后 编辑设置 找到Tomcat--local 选中 点击OK 名称可以自己设置 找到对应文件夹路径 把Tomcat添加到项目里面 因为…

C++之通俗易懂学模版

目录 一、了解什么是泛性编程 二、模版 1.函数模版 1.1 函数模板概念 1.2 函数模板格式 1.3 函数模板的原理 1.4 函数模板的实例化 1.5 模板参数的匹配原则 2.类模板 2.1 类模板的定义格式 2.2 类模板的实例化 3. 非类型模板参数 4. 模板的特化 4.1 概念 4.2 …

Visual Studio调试C/C++指南

1. 前言 Visual Studio&#xff08;VS&#xff09;是微软开发的一款集成开发环境(IDE)软件&#xff0c;支持C/C、C#、VB、Python等开发语言&#xff0c;开发桌面、Web等应用程序。VS功能极其强大&#xff0c;使用极其便利&#xff0c;用户数量最多&#xff0c;被誉为"宇宙…

Python 基础 (Pandas):Pandas 入门

1. 官方文档 API reference — pandas 2.2.2 documentation 2. 准备知识&#xff1a;Pandas 数据结构 Series & DataFrame 2.1 Series 2.1.1 创建 Series 类型数据 一个 Series 对象包含两部分&#xff1a;值序列、标识符序列。可通过 .values (返回 NumPy ndarry 类型…

C语言扫雷游戏完整实现(下)

文章目录 前言一、排雷函数菜单二、排雷函数菜单的实现三、拓展棋盘功能四、源码1. test.c源文件2. game.h头文件3. game.c源文件 总结 前言 C语言实现扫雷游戏的排雷菜单&#xff0c;以及功能的实现&#xff0c;拓展棋盘功能&#xff0c;以及源码等。 上半部分的链接地址: C语…

第十五届蓝桥杯省赛第二场PythonB组B题【逆序对期望】题解(AC)

解题思路 枚举所有的可能的交换情况&#xff0c;时间复杂度 O ( n 4 ) O(n^4) O(n4)。 用归并排序计算数组的逆序对&#xff0c;时间复杂度 O ( n ) O(n) O(n)。 综上时间复杂度 O ( n 5 ) O(n^5) O(n5)。 由于 Python 运行效率较低&#xff0c;约 500 500 500 秒可得到…

前端框架技术调研

目前程序员使用前端框架最多的是哪一个&#xff1f;

SEGGER Embedded Studio IDE移植FreeRTOS

SEGGER Embedded Studio IDE移植FreeRTOS 一、简介二、技术路线2.1 获取FreeRTOS源码2.2 将必要的文件复制到工程中2.2.1 移植C文件2.2.2 移植portable文件2.2.3 移植头文件 2.3 创建FreeRTOSConfig.h并进行配置2.3.1 处理中断优先级2.3.2 configASSERT( x )的处理2.3.3 关于系…

echarts树图-实现拓扑图效果

使用echarts树图来实现拓扑图效果&#xff0c;其效果如下&#xff1a; 代码如下&#xff1a; const data {name: XXX公司,children: [{name: 网络主机,children: [{name: 普通路由器,children: [{name: 智能网关},{name: 192.168.1.0/24}]}]},{name: 企业路由器},{name: 三…

【分享】WinRAR软件如何压缩文件?

WinRAR是一款功能强大的压缩文件管理工具&#xff0c;支持多种压缩文件格式&#xff0c;那如何使用WinRAR来压缩文件呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 压缩方法&#xff1a; 首先&#xff0c;安装好WinRAR工具&#xff0c;然后选中需要压缩的文件或文件夹…