java单例模式

什么是单例模式:

  保证一个类在程序的生命周期里只有一个实例,并提供该实例的全局访问方法。


单例的结构(三要素):

    1. 私有的静态实例对象private static instance
    2. 私有的构造函数private Singleton(){}
    3. 公共的、静态的、访问该实例对象的方法public static Singleton 

 

单例模式的分类:

懒汉模式:

以时间换空间,当程序启动时并不在第一时间创造该实例的对象,只有当外部调用该实例对象时才会创建。

优点:当需要实例对象的时候才进行创建可以节约很多资源,体现出了延迟加载思想。

缺点:当在同一个时间点有多个线程调用生成实例的方法,那将会生成多个不同的实例,这样就无法保证生成实例的唯一性,想要同步实例,就要考虑到多线程竞争锁,这样会使得效率下降。

饿汉模式:

以空间换时间,当程序启动时不管外部有没有调用,都会创造出该实例的对象。

优点:即使在多线程的情况下也能保证实例的唯一性,效率较高。

缺点:程序启动就创建实例,如果在程序的运行中没有用到该实例,那么就消耗了系统的资源。


 

 懒汉单例:

package com.singleton;
/**
 *懒汉单例模式 
 */
public class LazySingleton{

    /**
     * 私有化构造函数
     */
    private LazySingleton(){
        System.out.println("生成懒汉模式的实例");
    }
    
    /**
     * 私有静态实例变量
     */
    private static LazySingleton lasySingleton = null;
    
    /**
     * 获取该实例的公共的方法
     * @return lasySingleton
     */
    public static LazySingleton getLazySingleton(){
        //判断实例是否已经创建,如果创建了就返回原来的实例,如果没有创建就创建新的实例
        if(lasySingleton == null){
            lasySingleton = new LazySingleton();
        }
        return lasySingleton;
    }
    
}

 

 饿汉单例:

package com.singleton;
/*
 * 饿汉单例模式
 */
public class HungrySingleton {
    
    /**
     * 私有化构造方法
     */
    private HungrySingleton(){
        System.out.println("生成饿汉单例模式");
    }
    
    /**
     * 当程序启动时创建私有静态的饿汉实例
     */
    private static HungrySingleton hungrySingleton = new HungrySingleton();
    
    /**
     * 公共静态的获取饿汉实例
     */
    public static HungrySingleton getHungrySingleton(){
        return hungrySingleton;
    }
    
}

 

 

 

posted @ 2018-01-29 16:21  贝尔的蝙蝠  阅读(98)  评论(0)    收藏  举报