十三种设计模式

1.单例设计模式

1.1 创建对象的四种方式
  1. 直接new
  2. 反射
  3. 序列化和反序列化
  4. clone()
1.2 单例模式-懒汉模式
1.2.1 懒汉模式三要素:
  1. 私有成员变量
  2. 私有构造方法
  3. 获取实例的静态方法
1.2.1 懒汉模式-代码
class LazySingleton{
private volatile static LazySingleton instance;
private LazySingleton(){
}
public static LazySingleton getInstance() {
if (instance==null){
 return instance;
}
}
}

懒汉模式中需要注意:获取对象方法需要加锁,防止并发调用时多次实例化。加锁之后还需要给属性instance增加volatile关键字,防止编译器在执行new 方法时发生指令重排,在锁外等待的线程拿到属性未赋值的对象。

1.2.3 懒汉模式-改进后代码
class LazySingleton{
private volatile static LazySingleton instance;
private LazySingleton(){
}
public static LazySingleton getInstance() {
if (instance==null){
synchronized (LazySingleton.class){
if (instance==null){
 instance=new LazySingleton();
 }
 }
 }
 return instance;
 }
 }
1.3 单例模式-饿汉模式
1.3.1 饿汉模式要素:
  1. 静态成员变量
  2. 私有构造方法
  3. 获取实例的静态方法
1.3.2 饿汉模式原理:

借助类加载机制,定义静态成员变量。在jvm加载类时实例化对象((JVM以同步的形式来完成类加载的整个过程)。

1.3.3 饿汉模式代码
1.4 单例模式-静态内部类
1.4.1 静态内部类要素:
  1. 原始的类
  2. 静态内部类
  3. 静态内部类内部包含(外部类的私有构造方法,提供获取实例的静态方法)
1.4.2 静态内部类原理

实际上也是利用了类加载机制来保证单例,但是是在实际使用时才会创建对象,所以也属于懒汉模式。

1.4.1 饿汉模式代码
1.5 单例模式-枚举

以上几种单例模式,虽然看起来没有问题,但是我们可以通过获取对象的其它几种方式,如反射和序列化来打破,所以实际在使用时还需要实现序列化接口Serializable重写readResolve()保证序列化和反序列化也是返回同一个实例。防止反射可以在私有构造方法内部增加判断逻辑,在执行构造方法时判断当前对象实例是否已经存在。

2.工厂模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。即定义抽象方法,由子类自己做实现。

3.抽象工厂

由一组抽象工厂合在一起组成的叫抽象工厂。即多个接口定义的方法,组合在一起。

4.建造者模式

将一个复杂对象的创建与他的表示分离,使得同样的构建过程可以创建。我们常常使用的Builder就是使用了建造者模式,避免了传统的构造方法传入多个参数。而是使用链式变成按照我们自己想要传参的顺序传参。

5.原型模式

spring中bean就有一个原型模式,即可以很方便的获取同一个类的不同对象实例。常见的方式有clone()

6.享元模式

运用共享技术有效地支持大量细粒度的对象。即运用缓存,实现对象的服用,如线程池实现了线程的复用。spring中的单例池实现了对象的复用。

7.享元模式

为子系统中的一组接口提供一个一致的接口,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。比如mvc中的Service中有多个接口,我们会在Controller中提供一个接口,在Controller中完成多个service的调用,对外部只需要暴露Controller的接口就行了。

8.适配器模式

将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 比如想将A接口转成B接口,我们可以在B接口中定义成员变量A,我们直接new B(A),这样就将A接口转成了B接口,从而可以使用B接口中的方法。

9.装饰器模式

在不改变原有对象的基础上,将功能附加到对象上。我们常见的Wrapper类就是使用了装饰器模式,经过实现接口或者继承的方式,在实现原有功能的基础上增加附加功能。

10.策略器模式

定义了算法族,分别封装起来,让它们之间可以互相替换,此模式的变化独立于算法的使用者。 在相同逻辑和不同的逻辑,不同的逻辑是未知的,因此我们可以将未知的行为定义为接口,我们在对象中持有这个接口,想要实现不同的功能,将不同的实现传入就可以了。 JDK中的排序功能就是策略模式具体的体现,排序方法由我们自己传入,具体使用什么排序方式需要看我们传入的实现。

11.模板方法模式

定义一个操作的算法骨架,而将一些步骤延迟到子类中。TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。定义一个抽象方法,将公共的逻辑写在父类中,子类重写方法增加自己的特有的逻辑。HttpServler中的service方法就是模板方法,在这个方法中根据请求的不同判断会具体执行doGet()或者doPost(),service中定义了公共的逻辑,具体的实现如doGet()、doPost()需要由子类实现。

12.观察者模式

定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并更新。nacos注册中心中使用的发布订阅模式,只要订阅者关注了每个事件,当事件触发时,多个订阅者就会感知到变化。 spring中的事件监听机制都是用的观察者模式。

13.责任链模式

一个请求的处理需要多个对象当中的一个或几个协作处理。 在Netty中channel包含中的多个handler或者Sentinel中的多个Slot他们都是责任链模式,在处理一个动作时需要多个步骤协调来完成。他们构建成一个链条,按顺序执行各自逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值