转载:http://blog.csdn.net/kaixinbingju/article/details/8642826
单例模式的要点
显然单例模式的要点有三个;
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
在java中,可以使用以下这种方式使用单例模式创建类的实例:
1、Child.java代码如下:
- package com.zuxia.lei.singleFactory;
- public class Child {
- public void study(){
- System.out.println("Child is looking book!");
- }
- }
2、SingleFactory.java代码如下
- package com.zuxia.lei.singleFactory;
- /**
- * 单例模式就是在内存里只生成一个对象,也就是只提供一个环境
- * @author LeiZhongQiang
- *
- */
- public class SingleFactory {
- //单例模式的第一种写法
- //这里提供了一个供外部访问本class的静态方法,可以直接访问
- private static Child newChild=new Child();
- public static Child getInstance(){
- return newChild;
- }
- //单例模式第二种写法
- //这个方法不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率
- // private static Child newChild=null;
- // private static synchronized Child getInstance(){
- // if(newChild==null){
- // newChild=new Child();
- // }
- // return newChild;
- // }
- }
总结:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
单例模式需要考虑3中特殊情况:
1. clone
2. 序列化,反序列化
3. 反射
解决方法:
1. clone
可以不实现 Cloneable 接口
2. 序列化,反序列化
可以不实现Serializable接口
或者在单例对象中添加:
- private Object readResolve() throws ObjectStreamException {
- // instead of the object we're on,
- // return the class variable INSTANCE
- return INSTANCE;
- }
3. 反射
在私有构造函数中使用标志位控制,如果是第二次调用,则抛出异常