标签:
单例模式(Singleton)顾名思义,是一种对象创建型模式,保证一个类只有一个实例,并提供一个访问它的全局访问点。为此,我们需要保证一个类只有一个实例并且这个实例易于被我们访问,一个 全局变量使得一个对象可以被访问,但他不能防止你实例化多个对象。如下面的全局对象的使用:
Dog类:
public class Dog{
private String name;
public Dog(String name) {
System.out.println("Dog‘s name is "+name);
}
}
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;
}
}
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;
}
}
package com.singleton.lazy;
public class Test {
public static void main(String[] args) {
LazyPattern lazyPattern = LazyPattern.getInstance();
}
}
最后,我们来总结一下单例设计模式的优点:
可以对唯一实例进行受控访问;
能够减少过多的变量声明,这是对比存储唯一实例的全局变量而得出的;
允许对操作和表示进行精细,Singleton类可以拥有子类,而且用这个扩展类的实例来配置一个应用是很容易的,此外,还可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变。
标签:
原文地址:http://my.oschina.net/zzw922cn/blog/486700