标签:
单例模式(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