设计模式篇(2)--单例模式

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn.net/qq_29477223/article/details/82427678

0.引言

单例模式是设计模式最普遍也最常见的模式之一。它是用于产生一个对象的具体实例,确保系统中一个类只产生一个实例。

适用场景:系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源管理器,或者需要考虑资源消耗太大而只允许创建一个对象。客户调用类的单个实例只允许使用一个公共访问点,除你该公共访问点,不能通过其他途径访问该实例。

优点:

      提供了对唯一实例的受控访问

      由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能

      允许可变数目的实例

缺点:

      由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

      单例类的职责过重,在一定程度上违背了“单一职责原则”

      滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

在Java中这样的行为能带来对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级的对象而言,是非常可观的一笔系统开销;由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。

1.饿汉模式

public class EHSingleton{
    private EHSingleton(){}
    private static EHSingleton instance=new EHSingleton();
    public static EHSingleton getInstance(){
        return instance;
    }
}
//这种方式优点在于无须考虑多线程访问问题,可以确保实例的唯一性,但是由于它在类第一次初始化的时候被创建,而不是getInstance()方法第一次被调用的时候。

2.懒汉模式

//线程不安全
public class LHSingleton{
    private LHSingleton(){}
    private static LHSingleton instance=null;
    public static LHSingleton getInstance(){
        if(instance==null){
            instance=new LHSingleton();
        }
        return instance;
    }
}
//线程安全,效率低百分之99不需要同步
public class LHSingleton{
    private LHSingleton(){}
    private static LHSingleton instance=null;
    public static synchronized LHSingleton getInstance(){
        if(instance==null){
            instance=new LHSingleton();
        }
        return instance;
    }
}

3.静态内部类

//这种方式实现的单例同时有前两种方式的优点
public class StaticSingleton{
    private StaticSingleton(){
    }
    private static class SingletonHolder{
        private final static StaticSingleton instance =new StaticSingleton();
    }
    public static StaticSingleton getInstance(){
        return SingletonHolder.instance;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_29477223/article/details/82427678
今日推荐