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