设计模式之单例(单态)模式(Singleton)

单例模式主要是为了确保在程序运行期,有且只有一个实例对象。整个程序共享这个唯一的单例对象。

在程序的使用中,这种设计模式很常见。这里我就写一个我曾经学习时用到的案例:唯一的月亮。

设计这个月亮类的时候,我们需要注意以下几个点

1)私有构造方法 (防止外部可以用new来创建月亮类的实例)

2)私有静态类实例

3)公共方法getInstance,该公共方法为静态方法。

然后思路清晰,上代码:

package demo;

public class Moon {
	private static Moon moon;
	//月有阴晴圆缺的状态
	public String state;
	private Moon() {
		state="circle";
	}

	public static Moon getInstance() {
		if(moon==null)
			moon = new Moon();
		return moon;
	}
	
	public String getState(){
		return state;
	}
	
	public void setState(String st){
		state = st;
	}
}


测试Main类:

package demo;

public class Main {
	public static void main(String[] args) {
		Moon m1 =Moon.getInstance();
		
		System.out.println(m1.getState());
		
		Moon.getInstance().setState("half");
		
		System.out.println(m1.getState());
	}
}


运行结果:

circle
half


单例模式又分为三种,常见又分为懒汉,饿汉,登记时单例。

我上面的方式就是典型的懒汉,程序每次调用时都要检查Moon是否存在,不存在的情况下才创建。相对来说节省了空间,但是却浪费了时间。

饿汉,程序运行的时候就创建Moon实例,在getInstance的时候就直接返回实例,不需要查询实例是否存在,相对来说节省了时间,但是却浪费了空间,饿汉的Moon代码如下:

package demo;

public class Moon {
	private static Moon moon = new Moon();
	// 月有阴晴圆缺的状态
	public String state;

	private Moon() {
		state = "circle";
	}

	public static Moon getInstance() {
		return moon;
	}

	public String getState() {
		return state;
	}

	public void setState(String st) {
		state = st;
	}
}


登记时单例,利用到了Java的反射机制以及Map,通过键值来获取想要的单例。

深入学习的话,参考一下链接:

http://shuidexiongdi.iteye.com/blog/1208099

本项目下载连接:http://www.kuaipan.cn/file/id_132802506211221415.htm?source=1

 

posted @ 2013-12-25 11:55  Mr轨迹  阅读(271)  评论(0编辑  收藏  举报