码迷,mamicode.com
首页 > 编程语言 > 详细

Java设计模式之单例模式

时间:2015-08-02 21:48:10      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

单例模式介绍

单例模式(Singleton)顾名思义,是一种对象创建型模式,保证一个类只有一个实例,并提供一个访问它的全局访问点。为此,我们需要保证一个类只有一个实例并且这个实例易于被我们访问,一个 全局变量使得一个对象可以被访问,但他不能防止你实例化多个对象。如下面的全局对象的使用:

Dog类:

public class Dog{
	private String name;
        public Dog(String name) {
            System.out.println("Dog‘s name is "+name);
        }
}



在另外一段代码中声明全局变量的对象dog:
public Dog dog = new Dog("Peter");



这样并不能保证只有一只狗这个对象存在。 一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它提供一个访问该实例的方法。这就是单例模式。

单例模式的适用性

在下面情况下可以适用单例模式:

    当类只有一个实例而且客户可以从一个众所周知的访问点访问它;

    当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能适用一个扩展的实例。

单例模式的设计方法

单例模式需要保证类的构造方法为私有的,即private修饰符,以保证外界不能实例化这个类的对象。

而且单例模式需要该类自身创建自己的静态对象,并且需要定义一个getInstance()方法,即允许客户访问它的唯一实例。

单例模式的分类

单例模式分为饿汉模式和懒汉模式饿汉模式是指在编译时自动创建对象,运行时直接调用即可,这种创建方法的优点是加载慢,运行快,并且具有线程安全性;懒汉模式是编译时不会创建对象,仅在客户第一次访问时才创建该对象,这种创建方法的优点则相反,加载快,运行慢,并且不具有线程安全性。

单例模式示例代码

首先我们来写一个通用的饿汉模式程序模板:

package com.singleton.hangry;
/**
 * 设计模式之单例模式
 * 饿汉模式
 * 加载慢,运行快,线程安全
 * @author zzw
 *
 */
public class HangryPattern {
	private HangryPattern() {
		System.out.println("单例模式之饿汉模式"+"\r\n"+"特点:加载慢,运行快,线程安全");
	}
	private static HangryPattern hangryPattern = new HangryPattern();
	
	public static HangryPattern getInstance() {
		return hangryPattern;
	}
}



我们可以看到,上面代码中仅有getInstance()方法为public static,即客户只能调用此方法,此处我们为了通用性,不去关心单例的具体实现细节,接下来我们来写一个客户测试类:
package com.singleton.hangry;

public class Test {

	public static void main(String[] args) {
		HangryPattern hangryPattern = HangryPattern.getInstance();
	}

}



同样,我们来写一个通用的懒汉模式程序模板:

package com.singleton.lazy;
/**
 * 设计模式之单例模式
 * 懒汉模式
 * 加载快,运行慢,线程不安全
 * @author zzw
 *
 */
public class LazyPattern {
	
	private LazyPattern() {
		System.out.println("单例模式之懒汉模式"+"\r\n"+"特点:加载快,运行慢,线程不安全");
	}
	
	private static LazyPattern lazyPattern;
	
	public static LazyPattern getInstance() {
		if(lazyPattern == null) {
			lazyPattern = new LazyPattern();
		}
		return lazyPattern;
	}
}



我们可以看到,上面代码中仅有getInstance()方法为public static,即客户只能调用此方法,并且,懒汉模式中仅在客户第一次调用时才会创建。此处我们为了通用性,不去关心单例的具体实现细节,接下来我们来写一个客户测试类:
package com.singleton.lazy;

public class Test {

	public static void main(String[] args) {
		LazyPattern lazyPattern = LazyPattern.getInstance();
	}
}



这样我们就完成了饿汉模式和懒汉模式的模板代码了,按照具体项目的实现细节,可以套用该模板代码去应用单例设计模式。

单例设计模式的优点

最后,我们来总结一下单例设计模式的优点:

    可以对唯一实例进行受控访问;

    能够减少过多的变量声明,这是对比存储唯一实例的全局变量而得出的;

    允许对操作和表示进行精细,Singleton类可以拥有子类,而且用这个扩展类的实例来配置一个应用是很容易的,此外,还可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变。

Java设计模式之单例模式

标签:

原文地址:http://my.oschina.net/zzw922cn/blog/486700

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!