单例模式

点击查看各种单例模式实现方法
利用双重检查锁定(Double-Checked Locking)来降低同步的开销

public class Singleton {
 
    private static volatile Singleton sInstance = null;
    private Singleton () {
 
   }
   public static Singleton getInstance () {
        if (sInstance == null) { 
            Synchronized(Singleton.class){
                if (sInstance == null) {
                    sInstance = new Singleton();          
                }       
            }
         }
         return sInstance;
    }
}

为什么需要用volatile修饰变量sInstance ?
因为sInstance = new Singleton();这行代码实际上做了以下工作:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
memory = allocate();  // 1:分配对象的内存空间
ctorInstance(memory); // 2:初始化对象
instance = memory;  // 3:设置instance指向刚分配的内存地址

1、2、3指令可能会重排序为1、3、2,将导致外层判断出instance不为空,该线程接下来将访问instance引用的对象,而此对象事实上是一个还未初始化的对象。故需要加修饰,可以确保外层null检查要么看到的是null,要么看到的是一个构造完整的对象。
volatile可以保证有序性和可见性(即读操作在写操作之前)。

工厂模式

点击查看三种工厂模式详解
简单工厂:是一个具体的类,有一个重要的create()方法,根据入参判断new哪个实例,不符合开闭原则,扩展性差,新增需要修改工厂类方法。create()方法通常是静态的,所以也称之为静态工厂。
工厂方法:提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。利用多态性
抽象工厂:是可以生产多个产品的,而工厂方法模式则只能生产一个产品。

适配器模式

点击查看适配器模式详解
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作,类似生活中转接头的概念。
类适配器模式:通过继承来实现适配器功能。只能访问A接口,但想要调用B中的方法b,可以写适配器类P实现A接口,并继承B接口的实现类,这样就可以调用P中的方法b。
对象适配器模式:与上述类似,但只需实现A接口,并创建一个B的实现类的实例为成员变量bInstance,即可在a()中调用bInstance.b()。
接口适配器模式:已有一个包含很多方法的接口,创建一个实现该接口的实现类P,以置空的方式实现所有方法,我们需要哪些方法就直接继承P并重写对应的方法,而不需要重写所有的方法。

  • 使用场景
    • 系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码
    • 创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作

优点:将目标类和适配者类解耦,灵活性和扩展性都非常好,完全复合开闭原则。
缺点:一次最多只能适配一个适配者类,不能同时适配多个适配者。

点击查看别人总结spring中各种模式

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄