单例模式就是指整个应用中只能存在一个实例。单例类的创建有三种方式。就这三种方式可以作一个比较:
第一种:在声明变量处实例化对象(也叫 饿汉式 单例模式)代码如下:
package com.zds.pattern.singleton;
/** *//**
* @author sam E-mail:ashan8888@163.com
* @version 1.0
*/
public class SingletonA {
private static SingletonA singletonA = new SingletonA();
private SingletonA(){
System.out.println("饿汉式");
}
public static SingletonA getInstance(){
return singletonA;
}
}
第二种:把对象的创建放到方法里边去(也较 懒汉式 单例模式)代码如下:
package com.zds.pattern.singleton;
/** *//**
* @author sam E-mail:ashan8888@163.com
* @version 1.0
*/
public class SingletonB {
private static SingletonB singletonB;
private SingletonB(){
System.out.println("懒汉式");
}
synchronized public static SingletonB getInstance() {
if (singletonB == null) {
singletonB = new SingletonB();
}
return singletonB;
}
}
第三种:另类懒汉式方式:代码如下:
package com.zds.pattern.singleton;
/** *//**
* @author sam E-mail:ashan8888@163.com
* @version 1.0
*/
public class SingletonC {
static class SingletonHolder {
static SingletonC instance = new SingletonC();
}
private SingletonC(){
System.out.println("另类懒汉式");
}
public static SingletonC getInstance() {
return SingletonHolder.instance;
}
}
他们之间有什么有缺点呢?? 先来看第一种方式:懒汉式
优点:在初始化的时候创建对象,调用getInstance的时候,没有同步方法,性能较高。
缺点:可能导致数据还未初始完就创建了对象,故有可能对象数据初始不正确。
上边第一段代码例子太简单了,看不成任何问题,那么来写一个可能产生问题的例子看看:代码如下:
package com.zds.pattern.singleton;
/** *//**
* @author sam E-mail:ashan8888@163.com
* @version 1.0
*/
public class SingletonAa {
private static SingletonAa singletonAa = new SingletonAa();
public static String name = "sam";
public static String password;
static {
password = "tiger";
}
private SingletonAa(){
if(name.equals("sam")) System.out.println("name is ok");
if(password.equals("tiger")) System.out.println(" password is ok");
}
public static SingletonAa getInstance() {
return singletonAa;
}
}
写到这个地方,是不是能看出点眉目了,呵呵,上边代码是不是会抛出:java.lang.NullPointerException异常,为什么呢,很简单,我们知道
类的加载过程是什么: 装载----验证 ---准备---解析---初始化。初始化之前,类加载器会把所有变量都默认为对应类型的默认值。复合类型变量是不是为null,而在初始的时候,上边的第一条语句就new了本身,在进入构造器函数的时候,是不是就产生了错误。
第二种创建方式的优缺点:
优点:避免了第一种方式可能产生的错误。
缺点:不利于用在多线程上,因为他使用了锁,这样在资源上有很大浪费。
后来有人提出了双检查单例模式,参考资料在:http://www.ibm.com/developerworks/java/library/j-dcl.html?dwzone=java
第三种创建方式的优缺点:(Bob lee创建的)
优点: 综合了上诉两种方法的优点,故,我比较推荐使用这种方式;
分享到:
相关推荐
java设计模式中的单例模式,而单例模式又分为饿汉模式和懒汉模式
设计模式--单例模式java例子
设计模式专题之(一)单例模式---设计模式单例模式模式示例代码(python--c++)
李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。
设计模式-单例模式 学习时候联系的代码,可以进行参考
设计模式-单例模式脑图
JAVA-设计模式-创建型模式-单例模式
ava常用设计模式-单例模式
设计模式-单例模式(讲解及其实现代码)
Java设计模式-单例模式详解
常见设计模式-单例模式
设计模式 For iOS-02-单例模式 严 格 严谨 详细的单例模式。
c++设计模式-创建型模式-单例模式源码,懒汉式 饿汉式源码,qt工程,单例模式线程安全问题,单例模式实现方式
Java-设计模式-单例模式-实现源码(简单实现、双重检查锁、静态内部类、枚举类)
android 单例模式 干货 告诉你哪种单例模式最实用 最好用 不再迷茫
设计模式总结-模板设计模式,单例模式(singleTon)
设计模式ForiOS-02-单例模式实用.pdf
NULL 博文链接:https://linxingliang.iteye.com/blog/1217811
设计模式实验报告
本文档,详细的描述了单例模式,有类图,java代码实例,以及讲解、注意点,通过这份文档可以让你很容易理解单例设计模式。