设计模式

2018-04-04  本文已影响9人  激励上善若水

六大原则

以上为SOLID(面向对象编程的五个基本原则)

一、单例模式

  1. 懒汉式(需要的时候再加载)
public class Singleton {
    private static Singleton instance;
    private Singleton(){}

    public static synchronized Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}
//优点:使用时加载,节省资源。
//缺点:每次都同步,造成不必要的同步开销

2.Double Check Lock(DCL)

public class Singleton {
    private Singleton(){}
    private static volatile Singleton instance = null;
    public static Singleton getInstance(){
        if(instance == null) {
            synchronized (Singleton.class) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
//两次null判断的意义:
//第一层为了避免不必要的同步
//第二层是为了在null的情况下创建实例

//  new Singleton()后执行的三个步骤:
//  1.给Singleton()分配内存
//  2.调用Singleton()的构造函数
//  3.将instance对象指向分配的内存空间(此时instance已经不是空了)

//  DCL失效问题
//  由于:java编译器允许处理器重排序
//  所以:如果执行顺序是132,13执行以后,另一个线程获取到instance不是空,使用时会出错(由于未执行2)
    
//  volatile意义:
//  1.每次都从主内存中读取数据.
//  2.插入特定的内存屏障指令,通过内存屏障来禁止特定类型的处理器指令重排序
//  
//  所以:volatile修饰的变量阻止指令重排序,其他线程读取到非空的时候,此时instance已经初始化完成。
  1. 静态内部类
public class Singleton {
    private Singleton(){}
    
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
    
    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }
}
//优点:延迟加载:只有调用getInstance时才会new Singleton
//线程安全,单例唯一

二、策略模式

三、代理模式

四、装饰者模式

五、适配器模式

六、工厂方法

七、抽象工厂

八、责任链

九、观察者模式

十、Builder模式

十一、原型模式

上一篇 下一篇

猜你喜欢

热点阅读