设计模式之单例(单态)模式(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

浙公网安备 33010602011771号