(参考:http://blog.csdn.net/lanzhizhuxia/article/details/7920556,http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html)
单例模式的特点:
单例类只能有一个实例。
单例类必须自己创建自己的唯一实例。
单例类必须给所有其他对象提供这一实例。
饿汉式其实是一种比较形象的称谓。既然饿,那么在创建对象实例的时候就比较着急,饿了嘛,于是在装载类的时候就创建对象实例。
懒汉式其实是一种比较形象的称谓。既然懒,那么在创建对象实例的时候就不着急。会一直等到马上要使用对象实例的时候才会创建,懒人嘛,总是推脱不开的时候才会真正去执行工作,因此在装载对象的时候不创建对象实例。
/** * Project Name:DesignPatterns * File Name:EagerSingleton.java * Package Name:com.louis.singlePattern * Date:2017年9月26日下午8:36:37 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.singlePattern; /** * ClassName:EagerSingleton * Function: 饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,不管你用不用,先创建出来, * 然后每次调用的时候,就不需要再判断,节省了运行时间 * Reason: TODO ADD REASON. * Date: 2017年9月26日 下午8:36:37 * @author michael * @version * @since JDK 1.7 * @see */ public class EagerSingleton { //设置静态变量,直接创建实例 public static EagerSingleton eagerSingleton = new EagerSingleton(); /** * 私有构造方法 * */ private EagerSingleton() { System.out.println("调用私有构造方法"); } //开放一个共有方法 public static EagerSingleton getInstance(){ System.out.println("返回实例"); return eagerSingleton; } }
/** * Project Name:DesignPatterns * File Name:LazySingleton.java * Package Name:com.louis.singlePattern * Date:2017年9月26日下午8:51:15 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.singlePattern; import javax.management.InstanceAlreadyExistsException; /** * ClassName:LazySingleton * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年9月26日 下午8:51:15 * @author michael * @version * @since JDK 1.7 * @see */ public class LazySingleton { //静态变量 public static LazySingleton lazySingleton = null; //私有构造函数 private LazySingleton(){ System.out.println("调用构造函数"); } /* * 静态工厂方法 * */ public static synchronized LazySingleton getInstance(){ if(lazySingleton == null){ lazySingleton = new LazySingleton(); System.out.println("创建实例"); } System.out.println("返回实例"); return lazySingleton; } }
/** * Project Name:DesignPatterns * File Name:MainSingle.java * Package Name:com.louis.singlePattern * Date:2017年9月26日下午8:41:12 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved. * */ package com.louis.singlePattern; /** * ClassName:MainSingle * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年9月26日 下午8:41:12 * @author michael * @version * @since JDK 1.7 * @see */ public class MainSingle { /* public static void main(String[] args) { EagerSingleton eagerSingleton = EagerSingleton.getInstance(); EagerSingleton eagerSingleton2 = EagerSingleton.getInstance(); if(eagerSingleton==eagerSingleton2){ System.out.println("是同一个实例"); } } */ public static void main(String[] args) { LazySingleton lazySingleton = LazySingleton.getInstance(); LazySingleton lazySingleton2 = lazySingleton.getInstance(); if(lazySingleton==lazySingleton2){ System.out.println("是同一个实例"); } } }