设计模式-学习总结

学习总结

    • 本文仅供自我学习使用 我是一个小白
    • 设计模式
      • 一.创建型模式
        • 1.单例模式
          • (1).饿汉式
          • (2).懒汉式,双检锁
          • (3).静态内部类
          • (4).枚举
        • 2.原型模式
        • 3.工厂模式
          • (1).简单工厂模式
        • 4.抽象工厂模式
        • 5.建造者模式
      • 二.结构型模式
        • 6.适配器模式
          • 7.组合模式
          • 8.装饰器模式
          • 9.外观模式
          • 10.享元模式
          • 11.代理模式
            • (1).静态代理
            • (2).jdk动态代理
            • (3).cglib动态代理
        • 12.桥接模式
      • 三.行为型模式
        • 13.责任链模式
          • 14.命令模式
          • 15.解释器模式
          • 16.迭代器模式
          • 17.观察者模式
          • 18.状态模式
          • 19.模板模式
          • 20.中介者模式
          • 21.备忘录模式
          • 22.访问者模式
          • 23.策略模式
        • 四.其他
          • 24.过滤器模式
          • 25.空对象模式

本文仅供自我学习使用 我是一个小白

设计模式

  • 创建型模式用于以灵活和高效的方式创建对象。包括Singleton模式、工厂模式和抽象工厂模式等。
  • 结构型模式用于组合类和对象以形成更大的结构。包括适配器模式、桥接模式和装饰器模式等。
  • 行为型模式用于处理类或对象之间的通信和控制流。包括观察者模式、策略模式和模板方法模式。
  • 设计模式的六大原则
  • 单一职责原则(SRP):一个类只应该有一个引起它变化的原因。
  • 开放封闭原则(OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
  • 里氏替换原则(LSP):子类型必须能够替换掉它们的父类型。
  • 依赖倒置原则(DIP):高层模块不应该依赖于低层模块,两者都应该依赖于抽象接口;抽象接口不应该依赖于具体实现,具体实现应该依赖于抽象接口。
  • 接口隔离原则(ISP):不应该强迫一个类实现它不需要的接口,应该将接口拆分成更小和更具体的部分,以便客户端只需要知道它们感兴趣的部分。
  • 迪米特法则(LOD):一个对象应该对其他对象有尽可能少的了解,通常称为“最少知识原则”。

一.创建型模式

创建型模式用于以灵活和高效的方式创建对象

1.单例模式
(1).饿汉式

类在初始化的时候就实现实例化

public class Singleton {private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}
(2).懒汉式,双检锁

类在第一次调用的时候进行的实例化加载a

/*** 在懒汉式基础上加入双重检验锁,保证线程安全和性能。*/
public class Singleton {private volatile static Singleton instance = null;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
/*** 普通懒汉式*/
public class Singleton2{//私有的默认构造子private Singleton2(){}//注意,这里没有finalprivate static Singleton2 single=null;//静态工厂方法public synchronized static Singleton2 getInstance(){if(single==null){single=new Singleton2();}return single;}
}
(3).静态内部类
/*** 使用静态内部类来实现懒汉式单例模式,保证线程安全和性能。这种方式能达到双检锁方式一样的功效,但实现更简单。*/
public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}
(4).枚举
public enum Singleton {INSTANCE;private Singleton() {// 私有构造方法//}public static Singleton getInstance() {return INSTANCE;}
}

1.线程安全:
枚举单例模式是线程安全的。由于枚举常量只会被实例化一次,所以无论多少个线程并发访问,都能
保证只有一个实例被创建。
2.防止反射攻击
枚举单例模式天然地防止了反射攻击。在Java中,通过反射可以获取类的私有构造器,并强制创建实
例。但是,对于枚举类来说,私有构造器是无法被反射调用的,因此无法通过反射来创建枚举类的实
例。
3.防止序列化和反序列化问题
枚举单例模式也能防止序列化和反序列化问题。当一个枚举类型被序列化时,只会将枚举常量的名称
写入到序列化流中,而不会序列化枚举常量本身。当枚举类型被反序列化时,只会通过名称来获取对
应的枚举常量。因此,无论是序列化还是反序列化,都无法破坏枚举单例的特性。
枚举单例模式的应用场景

枚举单例模式适用于以下场景:
需要实现单例的类比较简单,没有复杂的初始化过程。
需要确保线程安全。
需要防止反射攻击和序列化问题。
由于枚举单例模式的优势,建议在满足以上条件的情况下使用枚举单例。
2.原型模式

以一个实例为原型克隆出来和他一样的实例
浅克隆

public class Person implements Cloneable {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/*** 进行浅克隆  如果克隆对象里面的值发生改变也会影响到其他对象的值* @return* @throws CloneNotSupportedException*/@Overridepublic Person clone() throws CloneNotSupportedException {return (Person) super.clone();}
}

深克隆(原型引用类型,并且原型和引用类型都需要实现序列化,和实现克隆接口)


public class DeepProtoType implements Serializable, Cloneable {public String name; //String 属性public DeepCloneableTarget deepCloneableTarget;// 引用类型public DeepProtoType() {super();}//深拷贝 通过对象的序列化实现public Object deepClone() {//创建流对象ByteArrayOutputStream bos = null;ObjectOutputStream oos = null;ByteArrayInputStream bis = null;ObjectInputStream ois = null;try {//序列化bos = new ByteArrayOutputStream();oos = new ObjectOutputStream(bos);oos.writeObject(this); //当前这个对象以对象流的方式输出//反序列化bis = new ByteArrayInputStream(bos.toByteArray());ois = new ObjectInputStream(bis);DeepProtoType copyObj = (DeepProtoType) ois.readObject();return copyObj;} catch (Exception e) {e.printStackTrace();return null;} finally {//关闭流try {bos.close();oos.close();bis.close();ois.close();} catch (Exception e2) {System.out.println(e2.getMessage());}}}
}
3.工厂模式

java的工厂模式

(1).简单工厂模式

静态工厂方法模式,可以根据参数的不同返回不同类的实例,简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都是具有共同的父类.
在这里插入图片描述

小知识:
在面对对象程序设计而定时候,需要遵循开闭原则(开闭原则规定:程序对于扩展是开放的,对于修改是
封闭的),打个比方现在有一个生产螺丝的生产螺丝,现在突然加了一一个任务需要生产口罩,这个时候
可以选择新增一个生产线来进行生产口罩而不是再原来的基础上将生产螺丝的机器改为生产口罩的
生产线

/*** SimpleFactory 工厂类* 优点:创建和使用分开,创建完全交给工厂类* 缺点:工厂类不够灵活,对象特别多的时候工厂类都需要进行改动判断--后面可以参考策略模式改进*/
public class SimpleFactory {public static Product createProduct(String type) {if (StringUtils.isNotEmpty(type) && type.equals("A")) {return new ProductA();} else {return new ProductB();}}public static void main(String[] args) {SimpleFactory.createProduct("A");SimpleFactory.createProduct("B");}}abstract class Product {public abstract void print();
}/*** 对象产品A*/
class ProductA extends Product {@Overridepublic void print() {System.out.println("ProductA");}
}/*** 对象产品B*/
class ProductB extends Product {@Overridepublic void print() {System.out.println("ProductB");}
}
4.抽象工厂模式

一个工厂下面还有其他多个工厂,可以理解为多个复合的简单工厂合集–这里实际上是属于违反开闭原则

public class FactoryPattern {public static void main(String[] args) {Factory factory = new AppleFactory();Phone phone = factory.createPhone();phone.print();}
}
interface  Phone{void print();
}class Iphone implements Phone{@Overridepublic void print() {System.out.println("安卓手机");}
}class ApplePhone implements Phone{@Overridepublic void print() {System.out.println("苹果手机");}
}/*** 抽象工厂*/
interface Factory{Phone createPhone();
}/*** 安卓手机工厂类*/
class IPhoneFactory implements Factory{@Overridepublic Phone createPhone() {return new Iphone();}
}/*** 苹果手机工厂类*/
class AppleFactory implements Factory{@Overridepublic Phone createPhone() {return new ApplePhone();}
}
5.建造者模式

二.结构型模式

结构型模式用于组合类和对象以形成更大的结构

6.适配器模式
7.组合模式
8.装饰器模式

动态的给一个对象添加一些额外的功能,就增加功能来说,装饰模式比生成子类更加灵活

在这里插入图片描述

public class DecoratorPattern {public static void main(String[] args) {new RobotDecorator(new FirstRobot()).doMoreThing();}}interface Robot {void doSomething();
}/*** 装饰器*/
class FirstRobot implements Robot {@Overridepublic void doSomething() {System.out.println("我会走路");System.out.println("我会唱歌");}
}class RobotDecorator implements Robot {private Robot robot;public RobotDecorator(Robot robot) {this.robot = robot;}@Overridepublic void doSomething() {robot.doSomething();}public void doMoreThing(){robot.doSomething();System.out.println("我新增了跳舞功能");}
}
9.外观模式
10.享元模式
11.代理模式
(1).静态代理
(2).jdk动态代理
(3).cglib动态代理
12.桥接模式

三.行为型模式

行为型模式用于处理类或对象之间的通信和控制流

13.责任链模式
14.命令模式
15.解释器模式
16.迭代器模式
17.观察者模式
18.状态模式
19.模板模式
20.中介者模式
21.备忘录模式
22.访问者模式
23.策略模式
四.其他
24.过滤器模式
25.空对象模式

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

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

相关文章

【AI】行业消息精选和分析(11月22日)

今日动态 👓 Video-LLaVA:视觉语言模型革新: - 图像和视频信息转换为文字格式。 - 多模态理解能力,适用于自动问答系统等。 📈 百度文心一言用户数达7000万: 🔊 RealtimeTTS:实时文本…

SpringBoot : ch06 整合 web (一)

前言 SpringBoot作为一款优秀的框架,不仅提供了快速开发的能力,同时也提供了丰富的文档和示例,让开发者更加容易上手。在本博客中,我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术,并通过实例代码来演示如何…

《微信小程序案例大全》大学生期末大作业可以直接使用!!

前言 在大学生活中,期末大作业是锻炼和展示自己所学知识的重要时刻。微信小程序作为一种快速、便捷的应用开发方式,成为了大学生开发实践的热门选择。本文将为大家推荐一系列可以直接使用的微信小程序案例,包括仿真社交、图书管理、学习工具…

接口自动化测试实战经验分享,测试用例也能自动生成

作为测试,你可能会对以下场景感到似曾相识:开发改好的 BUG 反复横跳;版本兼容逻辑多,修复一个 BUG 触发了更多 BUG;上线时系统监控毫无异常,过段时间用户投诉某个页面无数据;改动祖传代码时如履…

CentOS 7 使用pugixml 库

安装 pugixml Git下载地址:https://github.com/zeux/pugixml 步骤1:首先,你需要下载pugixml 的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2:下载完成后,需要将源代码解压…

利用QRCode.js生成动态二维码页面

文章目录 QRCode.js简介HTML结构JavaScript生成动态二维码拓展功能1. 联系信息二维码2. Wi-Fi网络信息二维码 总结 🎉利用QRCode.js生成动态二维码页面 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客🎈该系列文章专栏…

微信小程序开发者工具] ? Enable IDE Service (y/N) ESC[27DESC[27C

在HBuilder运行微信小程序开发者工具报错 如何解决 打开微信小程序开发者工具打开设置--->安全设置--->服务器端口选择打开就可以啦

《C++ Primer》第9章 顺序容器(三)

参考资料: 《C Primer》第5版《C Primer 习题集》第5版 9.5 额外的string操作(P320) 9.5.1 构造string的其他方法 const char *cp "hello, world!"; char arr[] { h,\0,i,\0 }; string s1(cp); // s1 "hello, world!…

C#中的var究竟是强类型还是弱类型?

前言 在C#中,var关键字是用来声明变量类型的,它是C# 3.0推出的新特征,它允许编译器根据初始化表达式推断变量类型,有点跟javascript类似,而javascript中的var是弱类型。它让C#变量声明更加简洁,但也导致了…

算法设计与分析复习--分支界限法

文章目录 上一篇分支界限法性质装载问题0-1背包问题单源最短路问题最大团问题下一篇 上一篇 算法设计与分析复习–回溯法(二) 分支界限法性质 分支界限法是按广度优先策略或最小耗费优先遍历问题的解空间树。 搜索解空间: 子集树排列树 …

APP自动化之Poco框架

今天给大家介绍一款自动化测试框架Poco,其脚本写法非常简洁、高效,其元素定位器效率更快,其本质基于python的第三方库,调试起来也会非常方便,能够很好的提升自动化测试效率,节省时间。 (一)背景…

如何实现数据通过表格批量导入数据库

文章目录 1. 准备工作2. 创建数据库表3. 编写导入脚本4. 优化和拓展4.1 批量插入的优势4.2 错误处理4.3 数据验证4.4 数据转换 5. 总结 🎉如何实现数据通过表格批量导入数据库 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客&…

初学者必读书籍——两个月速成Python

想学Python的你是不是一直被它生涩难懂的劝退?作为一个自学入门的程序员,依靠这样几本书,两个月就学会了python。不卖关子,我学的就是”python编程三剑客“系列。那么接下来就让我给你介绍介绍吧。 1.《Python编程:从入…

OSG文字-osgText3D(5)

osgText3D 三维立体文字比二维平面文字显示效果更好,相对二维平面文字,它有非常好的立体显示效果。 在实际虚拟现实项目中,过多使用三维立体文字会降低染效率,加重渲染负担,相对平面二维文字,它占用的内存是…

掌握Katalon Studio 导入 swagger 接口文档,接口测试效率提升100%

katalon studio大家都已经不陌生了,是一款现在非常主流的自动化测试工具,包括了web、api、APP,甚至PC应用程序都可以使用它来完成自动化测试。 swagger是一款RESTFUL接口的文档在线自动生成软件,swagger是一个规范和完整的框架&a…

Python通过selenium调用IE11浏览器报错解决方法

前提 正常安装Python 工具,selenium 包可以正常导入。IE浏览器驱动 IEDriverServer.exe 已经正确放置到已经添加path目录的文件下。 报错现象: 解决方法 打开浏览器进入 internet 选项 切换到安全页签 ,去除“应用保护模式” 再次调用验证…

C语言——I /深入理解指针(一)

一、内存和地址 1byte(字节) 8bit(比特位) 1KB 1024byte 1MB 1024KB 1GB 1024MB 1TB 1024GB 1PB 1024TB一个比特位可以存放二进制的0/1的一位 ⽣活中我们把⻔牌号也叫地址,在计算机中我们把内存单元的编号也称为…

真菌基因组研究高分策略(一):比较基因组揭示真菌菌丝和多细胞的起源

真菌是陆地和水生生态系统的重要组分,在有机质循环和跨营养级养分流通等过程中发挥着重要作用。随着测序技术的发展,高通量测序揭示了真菌群落巨大的系统发育和功能多样性,高质量真菌基因组的组装已经成为研究菌丝和潜在基因的进化起源的有力…

【c++】——类和对象(下) 万字解答疑惑

作者:chlorine 专栏:c专栏 目录 🚩再谈构造函数 🎓构造函数体赋值 🎓初始化列表 🚩explicit关键字 🚩static成员 🎓概念 面试题:计算创建多少个类对象 🎓特性 【问题】(非)…

智能合约安全漏洞与解决方案

// SPDX-License-Identifier: MIT pragma solidity ^0.7.0;import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/math/SafeMath.sol";/*智能合约安全在智能合约中安全问题是一个头等大事,因为智能合约不像其他语…