设计模式-

设计模式(仅详细讲几个常见的)

1. 设计模式分类

●创建型:单例模式、工厂模式、抽象工厂模式、原型模式、建造者模式

●结构型:代理模式、外观模式、装饰器模式、适配器模式、桥接模式、享元模式、组合模式

●行为型:迭代器模式、责任链模式、策略模式、模板模式、观察者模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

2. 单例模式

●即一个类只能有一个实例,常见于Spring的bean管理(默认为单例),多线程的线程池(方便控制池中的线程)。

●优点:内存中仅有一个对象,节省系统资源;

●缺点:一个对象承担了太多的职责,优点违背单一职责原则(虽然这个原则大都是用来限制类的设计的),同步问题。

●反射漏洞:当一个类采用单例模式,私有化构造器后,采用反射的方式仍然可以创建出很多实例。下面会介绍解决这个漏洞的办法(就是重写构造器方法,加一个判断条件而已)。

1

●单例模式创建方式

​ ■饿汉式:直接创建静态类变量,在类被载入的时候就加载出来这个实例了,所以线程安全。

2

​ ■懒汉式:在真正需要使用的时候才会创建该对象,只是在刚开始声明一下(注意使用sychronized保证线程安全,确保只创建一个实例)

3

​ ■静态内部类:结合懒汉式和饿汉式的特点,刚开始类导入的时候不会创建对象,这样就可以避免浪费资源,当需要使用对象的时候,加载内部类,内部类加载的过程中创建这个实例,保证线程安全。

●双重锁检测机制

​ ■我们都知道synchronized部分应该越小越好,所以懒汉式不应该直接加在方法部分,而是对其中的对象部分加synchronized锁。

​ ■如果instance == null 则进入同步代码块,否则直接返回已经创建的对象。

​ ■进入同步代码块后,如果直接创建对象,由于前面判断的地方没有加锁,所以可能很多线程都过了这个地方,所以在里面还要再判断一次instance == null保证对象不会重复创建。

​ ■同时,需要将对象声明为volatile(保证变量一创建,所有的线程都能知道),可以防止在指令重排序(对象创建过程需要先分配内存,然后初始化,然后设置对象的地址)后另一个线程在头部代码块外获得未初始化的对象。

5

3. 工厂模式

●提供了一种创建对象的方式,创建对象的时候不会对客户暴露创建对象的逻辑(你告诉我创建啥对象就行了,我再调用那个对象的构造器,而不是用户直接调用构造器),通过一个共同的接口来指向创建的对象。(Spring 的IOC底层就是反射+工厂模式+xml解析)

●优点:可以降低程序耦合性

●简单工厂模式:各个产品都实现一个共同的接口,然后工厂类通过传入的参数来判断,具体产生哪种实现类对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NImSHNAX-1650091548248)(http://luxiaolumm.gitee.io/luxiao-lu-mm/pic/6.png)]

7

●工厂方法模式:各个产品也还是都实现一个共同的接口,然后再创建一个工厂的接口,为每个产品类都创建一个实现了工厂接口的特定工厂

8

9

10

●抽象工厂模式:就是简单工厂的简单工厂,显示用工厂决定创建什么类型的工厂,然后再决定创建什么产品

11

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbCkkQwC-1650091548256)(http://luxiaolumm.gitee.io/luxiao-lu-mm/pic/12.png)]

13

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sILpc1Kd-1650091548257)(http://luxiaolumm.gitee.io/luxiao-lu-mm/pic/14.png)]

4.代理模式

● 通过代理控制对象的访问,可以在这个对象调用方法之前或者之后添加新的功能(Spring的AOP,日志打印)

●静态代理:在程序运行前就已经写好了代理类的字节码文件,代理类和委托关系在运行前就确定了。

15

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cVsTWcDc-1650091548260)(http://luxiaolumm.gitee.io/luxiao-lu-mm/pic/16.png)]

●动态代理-JDK代理:利用JDK的API,动态的在内存中构建代理对象(根据被代理类的接口动态实现代理类的class文件,并加载运行,所以这个类一定要有接口才行)

17

18

19

●CGLIB动态代理:利用开源工具包,对代理对象class文件进行加载,通过修改其字节码生成子类来处理(所以不能对final类进行代理,毕竟无子类)

20

21

22

5.建造者模式

●将一个复杂的构建与其组装方式相分离,使得相同的构建过程可以按需要构造出不同的对象(StringBuilder就是建造者模式创建的,它把一个个单个字符串的char数组组合起来)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTgePj4q-1650091548266)(http://luxiaolumm.gitee.io/luxiao-lu-mm/pic/23.png)]

24

25

26

27

6.观察者模式

●定义对象之间的一种一对多的依赖关系,使得当一个对象状态改变时,所有依赖它的对象都会得到通知并改变(用于跨系统的消息交换场景,如消息队列)

28

29

30

31

7.外观模式

●隐藏系统的复杂性,向客户端提供一个可访问的接口,通过这个接口来隐藏实际的系统复杂性。(eg 去医院看病,要挂号、门诊、划卡、取药,很复杂,如果门口提供接待人员,只需要找到接待人员即可)socket就是一个外观模式,作为应用层和TCP/IP协议簇通信的中间抽象层。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K19m6Mvz-1650091548272)(http://luxiaolumm.gitee.io/luxiao-lu-mm/pic/32.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W0iqpufZ-1650091548273)(http://luxiaolumm.gitee.io/luxiao-lu-mm/pic/33.png)]

34

35

36

8.原型模式

●实现cloneable接口(本接口的作用只有一个,告诉JVM可以安全的在实现这个接口的类上使用clone方法)

●重写Object类的clone方法(作用是返回对象的一个拷贝)

●浅复制:只是拷贝基本数据类型,引用类型只是复制了一份地址

●深复制:在计算机中对于引用类型也创建了一个新的赋值对象

37

38

39

9.写在最后

关于设计模式,常看一看就会懂得,其实真的很有用,刚开始学习的时候,不明白为什么有这么多种设计模式,有什么需求就做什么需求就好了,反复学习以后,发现原来生活中我们已经用到过许多设计模式,重在理解。

[外链图片转存中…(img-7Gs9SAG7-1650091548276)]

9.写在最后

关于设计模式,常看一看就会懂得,其实真的很有用,刚开始学习的时候,不明白为什么有这么多种设计模式,有什么需求就做什么需求就好了,反复学习以后,发现原来生活中我们已经用到过许多设计模式,重在理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值