设计模式-学习总结

学习总结

    • 本文仅供自我学习使用 我是一个小白
    • 设计模式
      • 一.创建型模式
        • 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,一经查实,立即删除!

相关文章

Spring国际化笔记整理

resources/message中添加hello.properties配置user.nameUserName {0}resources/message中添加hello_zh_CN.properties配置user.name用户名 {0}添加单元测试Slf4j public class MessageSourceTest {Testpublic void message(){Locale locale LocaleContextHolder.getLocale();S…

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

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

shell之read命令

shell之read命令 简介例子 简介 Linux的read命令用于从标准输入读取数据。它通常用于在shell脚本中读取用户的输入并将其分配给变量。 read命令的语法如下: read [-options] [variable]read命令的选项包括: -d:指定输入行的结束标志。 -p…

SpringBoot : ch06 整合 web (一)

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

独立按键程序

/*----------------------------------------------- 内容&#xff1a;切换到独立按键模式&#xff0c;通过按键在数码管显示对应的数字 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff…

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

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

电子元器件

目录 前言一、电阻 前言 本篇只介绍低功率元器件&#xff0c;电源等大功率元器件不做介绍 一、电阻

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

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

CentOS 7 使用pugixml 库

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

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

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

mysql 存储引擎ROWS与实际行数不一致

引言 在使用 MySQL 数据库时&#xff0c;我们经常会用到 SHOW TABLE STATUS 命令来获取表的统计信息&#xff0c;其中包括行数&#xff08;rows&#xff09;的估计值。然而&#xff0c;有时候我们会发现这个估计值与实际的行数并不一致。本文将探讨这个问题&#xff0c;并提供…

介绍下官网Redis编程模式

缘由 以前只是接触过redis&#xff0c;只有最近才比较深入研究了下&#xff0c;觉得有几个重要的概念可以积累出来&#xff0c;以利于帮助理解redis &#x1f603; 本文仅简述重点概念&#xff0c;和列举相关参考文档链接&#xff0c;但参见文档多来自redis官网&#xff0c;足…

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

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

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

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

代码随想录训练营 | 一刷总结

代码随想录一刷总结 文章目录 代码随想录一刷总结数组数组理论基础二分法双指针法滑动窗口 链表链表理论基础虚拟头节点链表的基本操作反转链表两两交换链表中的节点删除倒数第N个节点链表相交环形链表 哈希表哈希表理论基础数组作为哈希表Set作为哈希表Map作为哈希表 字符串双…

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

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

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

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

Promise.all如果其中之一失败,怎么能够拿到其他成功的结果

Promise.all 的基础介绍 作用&#xff1a;Promise.all()方法用于将多个 Promise 实例&#xff0c;包装成一个新的 Promise 实例。 参数&#xff1a;由多个Promise实例组成的数组 const p Promise.all([p1, p2, p3]);p的状态由p1、p2、p3决定&#xff0c;分成两种情况。 &a…

APP自动化之Poco框架

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

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

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