设计模式学习笔记-单例模式

时间:2022-08-28 00:10:52

简介

    在软件开发过程中,会遇到很多重复性的地方,设计模式就是开发前辈将一点一点开发经验整合成便于他人重复使用、高效率的代码模板。学习开发人员使用设计模式开发能大大提高开发效率。从而使得代码的可维护性、健壮性提高

单例模式  

   单例模式要求类只能创建唯一的一个实例。一般情况下,构造器在访问权限类型都是公有的,如果是private的,外界是无法依靠该类随意创建实例的。单例就是利用这个特性,先在内部创建一个该类唯一的实例,并且我们知道静态方法能通过类直接调用,利用这一特性,在类内部提供一个静态方法返回该类的唯一实例,这样外界就只能通过该方法获得这个实例。

饱汉式(没调用也一直在)

 1 class singleTone {
 2     
 3     private static final singleTone Instance=new singleTone();
 4     
 5     private singleTone(){};
 6     
 7     public static singleTone getInstance(){
 8         return Instance;
 9     }
10 }

 

   

class singleTone1{
    private static singleTone1 instance;
    static{
            
        instance=new singleTone1();
    }
    private singleTone1(){};
    
    public static singleTone1 getInstance(){
        return instance;
    }
}

 

该模式的缺点:由于是静态方法提供实例,如果没有外界调用,则会浪费内存资源

 

懒汉式(不调用就不生产)

 

class singleTone3{
    private static singleTone3 instance;
    private singleTone3(){};
    public static synchronized singleTone3 getInstance(){
        if(instance==null){
            instance=new singleTone3();
        }
        
        return instance;
    }

    
}

 

class singleTone4{
    private static singleTone4 instance;
    private singleTone4(){
        
    };
    
    public static  singleTone4 getInstance(){
        if(instance==null){
            synchronized (singleTone4.class) {
                instance =new singleTone4();
            }
        }
        
        return instance;
    } 
}

在并发编程环境下,就需要同步来提高程序的安全性,然而同步提高安全的办法(不管是方法上加synchronized,还是加同步块)会大大降低程序的效率

,要解决这种问题就需要双重检查

class singleTone5{
    private static singleTone5 instance;
    private singleTone5(){};
    public static singleTone5 getInstance(){
        if(instance==null)
            synchronized (singleTone5.class) {
                if(instance==null){
                    instance=new singleTone5();
                }
            }
        return instance;
    }
}

两次判断,既是线程安全也是延迟加载,而且提高了效率。

如此比较主要满足上诉优点,静态的内部类也可以做到。

class singleTone6{
    private singleTone6(){};
    private static class single{
        private static final singleTone6 instance=new singleTone6();
    }
    public static singleTone6 getInstance(){
        return single.instance;
    }
}