黑猫的博客

设计模式六大原则

开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象.
依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
迪米特法则 :一个对象应该对其他对象保持最少的了解。

Java设计模式——单例模式

Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
特点:
  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

 

//这种方法是线程不安全的,如果并发则会创建多个对象

class SinglePattern{
    private static SinglePattern instance ;
    //1.构造方法私有化
    private SinglePattern() {
    }
    //2.提供一个全局访问点
    public static SinglePattern getInstance() {
        if(instance == null) {
            instance = new SinglePattern();
        }
        return instance;
    }
}

多线程有一个锁机制。使用synchronized修饰。我们可以锁住获取对象的方法。代码如下:

/**
 * 加锁后的,单例模式类
 * @author wanghao
 *
 */
class SinglePattern{
    private static SinglePattern instance ;
    //1.构造方法私有化
    private SinglePattern() {
    }
    //2.提供一个全局访问点 加锁后
    public static synchronized SinglePattern getInstance() {
        if(instance == null) {
            instance = new SinglePattern();
        }
        return instance;
    }
}

众所周知线程安全就等于效率会相对低点。所有经过改造优化,出现另一种双重判断方式。代码如下:

/**
 * 加锁后的,单例模式类 +优化后
 * @author wanghao
 *
 */
class SinglePattern{
    private static SinglePattern instance ;
    //1.构造方法私有化
    private SinglePattern() {
    }
    //2.提供一个全局访问点 加锁后
    public static  SinglePattern getInstance() {
        if(instance == null) {
            synchronized(SinglePattern.class) {
                if(instance == null) {
                    instance = new SinglePattern();
                }
            }
        }
        return instance;
    }
}

单例模式重点就一个对象,这样理论上会是创建次数少获取的次数多。所以,我们只需加锁创建对象的方式,而判断是否为null,可以不加锁。可以提高效率。

如果按前面一种方式,如果高并发10个线程同时访问,则需要耗费10*(等待时间+判断时间),

而如果用第二张方式,如果通用10个线程访问,则只需10*(判断时间),如果没有对象则再加上一次判断时间和创建对象的时间。