设计模式之单例模式的六种实现

设计模式简介


        设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。
        随着软件开发社群对设计模式的兴趣日益增长,已经出版了一些相关的专著,定期召开相应的研讨会,而且Ward Cunningham为此发明了WikiWiki用来交流设计模式的经验。

        总之,设计模式就是为了解决某类重复出现的问题而出现的一套成功或有效的解决方案

        下面介绍一下:设计模式中的单例模式六种不同实现方法。

单例模式

懒汉式——线程不安全

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if(uniqueInstance == null) {
            uniqueInstance = new Singleton();
            return uniqueInstance;
        }
    }
}

饿汉式——线程安全

public class Singleton {
    private static Singleton uniqueInstance = new Singleton();

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        return uniqueInstance;
    }
}

懒汉式——线程安全

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {
    }

    public static synchronized Singleton getUniqueInstance() {
        if(uniqueInstance == null) {
            uniqueInstance = new Singleton();
            return uniqueInstance;
        }
    }
}

双重校验锁——线程安全

public class Singleton {
    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if(uniqueInstance == null) {
            synchronized(Singleton.class) {
                if(uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                    return uniqueInstance;
                }
            }
        }
    }
}

静态内部类实现——线程安全

public class Singleton {
    private Singleton() {
    }

    private static SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getUniqueInstance() {
        return SingletonHolder.INSTANCE;
    }
}

枚举实现——防止反射攻击

public enum Singleton {
    INSTANCE;
    private String objName;

    public void setObjName(String objName) {
        this.objName = objName;
    }

    public Object getObj() {
        return objName;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39312146/article/details/130957919