设计模式之单例模式(饿汉式、懒汉式)

摘要:单例模式是一种常见的设计模式。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数, 有利于Java垃圾回收(garbage collection)。

 

一、单例模式也是一种比较常见的设计模式,它到底能带给我们什么好处呢?其实无非是三个方面的作用:

     1、控制资源的使用,通过线程同步来控制资源的并发访问;

     2、控制实例产生的数量,达到节约资源的目的。

     3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。

 

二、常见的单例模式有两种:懒汉式单例、饿汉式单例。

    单例模式有以下特点:

    1、单例类只能有一个实例。

    2、单例类必须自己创建自己的唯一实例。

    3、单例类必须给所有其他对象提供这一实例。

 

     1)饿汉式单例

      在类加载的时候不创建单例实例。只有在第一次请求实例的时候的时候创建,并且只在第一次创建后,以后不再创建该类的实例。

 

package com.zad.my_encapsulation_single;

/**
 * 单例模式-饿汉式
 * 1、构造器私有化
 * 2、提供私有的静态属性 ,创建该对象
 * 3、提供公共的静态方法来访问该引用
 * @author zhongaidong
 */
public class EagerSingleton {
	// 2、提供私有的静态属性,在类加载的时候就创建该单例对象
    private static EagerSingleton eager = new EagerSingleton();
 
    // 1、构造器私有化,内部创建对象,避免外部创建实例
    private EagerSingleton() {
    }
 
    // 3、提供公共的静态方法来访问该引用,返回此类的唯一实例.
    public static EagerSingleton getInstance() {
        return eager;
    }
}

 

2)懒汉式单例

 

        在类被加载的时候,唯一实例已经被创建。这个设计模式在Java中容易实现,在别的语言中难以实现。

/**
 * 单例模式-懒汉式
 * 1、构造器私有化
 * 2、提供私有的静态属性 
 * 3、提供公共的静态方法来访问该引用
 * @author zhongaidong
 */
public class LazySingleton {
	// 2、提供私有的静态属性,加载时候不做初始化
	private static LazySingleton lazy;

	// 1、构造器私有化,内部创建对象,避免外部创建实例
	private LazySingleton() {
	}

	// 3、提供公共的静态方法来访问该引用。
	public static LazySingleton getInstance() {
		if (lazy == null) {
			lazy = new LazySingleton();
		}
		return lazy;
	}
}

 

三、如何使用单例对象

/**
 * 如何使用单例对象。
 * 
 * @author zhongaidong
 */
public class App {

	public static void main(String[] args) {

		// EagerSingleton eager =new EagerSingleton();  // 不能这样调用。
		EagerSingleton eager = EagerSingleton.getInstance();
		System.out.println(eager);
		System.out.println(EagerSingleton.getInstance());

		LazySingleton lazy = LazySingleton.getInstance();
		System.out.println(lazy);
		System.out.println(LazySingleton.getInstance());
	}
}

 

你可能感兴趣的:(设计模式,单例模式,饿汉式,懒汉式)