`
陌陌天使
  • 浏览: 21932 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式——单例模式(懒汉模式)

阅读更多

http://794950040.iteye.com/blog/2208102
以上面的饿汉模式实现为基础

/*
 * 懒汉模式
 */
public class Singleton2 {
	//1.将构造方式私有化,不允许外边直接创建对象
	private Singleton2(){
	}
}

 
然后三步走:
1.将构造方法改为私有的
2 .申明类的唯一实例,用private static修饰,但是不实例化
3.在get方法中实例化唯一对象
得到的类为:

/*
 * 懒汉模式
 */
public class Singleton2 {
	//1.将构造方式私有化,不允许外边直接创建对象
	private Singleton2(){
	}
	
	//2.声明类的唯一实例,使用private static修饰
	private static Singleton2 instance;
	
	//3.提供一个用于获取实例的方法,使用public static修饰
	public static Singleton2 getInstance(){
		if(instance==null){
			instance=new Singleton2();
		}
		return instance;
	}
}

 
在Test.java类中验证:

public class Test {
	public static void main(String[] args) {
		//饿汉模式
		Singleton s1=Singleton.getInstance();
		Singleton s2=Singleton.getInstance();
		if(s1==s2){
			System.out.println("s1和s2是同一个实例");
		}else{
			System.out.println("s1和s2不是同一个实例");
		}
		
		//懒汉模式
		Singleton2 s3=Singleton2.getInstance();
		Singleton2 s4=Singleton2.getInstance();
		if(s3==s4){
			System.out.println("s3和s4是同一个实例");
		}else{
			System.out.println("S3和s4不是同一个实例");
		}
	}
}

 
得到结果:
s1和s2是同一个实例
s3和s4是同一个实例

饿汉模式与懒汉模式的区别:
饿汉模式的特点是加载类时比较慢,但运行时获取对象的速度比较快,线程安全
懒汉模式的对象实例化在类加载的时候,所以加载速度比较慢,但是获取对象的时候就快了。

参考资料:http://www.imooc.com/learn/112

 

2
3
分享到:
评论
11 楼 devilyard 2015-05-13  
陌陌天使 写道
devilyard 写道
你试试并发

多个线程同时调用getInstance的意思吗?


对,懒汉模式至少要加上syncronized,并且在同步块内部再加null判断,这个叫做双重检查。即使是这样,私有的构造函数仍旧是可以通过反射来创建实例的。不过这样就有些钻牛角尖了,个人认为加上同步与双重检查就差不多了,保证正常使用不出错。
另外同步是有损性能的,在初始化实例的时候这个同步是有必要的,但是实例化完成之后,这个同步完全没用,建议看看读写锁
10 楼 陌陌天使 2015-05-05  
devilyard 写道
你试试并发

多个线程同时调用getInstance的意思吗?
9 楼 devilyard 2015-05-05  
你试试并发
8 楼 陌陌天使 2015-05-04  
chou_qi 写道
是不是应该加上final限定?你的单例好像可以被修改啊,哈哈,我自己猜的,你问问大牛们是不是这样,是的话要给我回复一下啊,

啊噢!我没有想到这个回收的问题,实现类的实例唯一,没说不能被修改吧!不能修改就是常亮,要这么复杂来干什么?就是一个唯一的对象啊,可操作可修改啊。
7 楼 chou_qi 2015-05-04  
是不是应该加上final限定?你的单例好像可以被修改啊,哈哈,我自己猜的,你问问大牛们是不是这样,是的话要给我回复一下啊,
6 楼 chou_qi 2015-05-04  
chou_qi 写道
懒汉模式 对么?表示疑问,我也不确定对不不对,感觉不正确,instance是不是存在被回收的可能,然后instance就成null了,然后又回生成一个新的,你在instance放一个属性试试:第一生成instance放1 当instance==null时,instance的属性放成2,
web发布后访问一次然后关闭页面,等N久后再次访问看看打出来的属性是1还是2

我错了,有static应该不会被回收。。。。。我错了
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
5 楼 chou_qi 2015-05-04  
懒汉模式 对么?表示疑问,我也不确定对不不对,感觉不正确,instance是不是存在被回收的可能,然后instance就成null了,然后又回生成一个新的,你在instance放一个属性试试:第一生成instance放1 当instance==null时,instance的属性放成2,
web发布后访问一次然后关闭页面,等N久后再次访问看看打出来的属性是1还是2
4 楼 陌陌天使 2015-05-04  
wengbo316 写道
陌陌天使 写道
wengbo316 写道
妹纸,复制来的文章不能重新排版一下么,HTML标签没有去除掉。
另外你这篇讲的是懒汉模式,文不对题呀。
第三,懒汉模式并非线程不安全,而是你没有加同步块。

1.我是刚开始看设计模式,所以有些知识说的很不到位,所以拿出来交流,也算是笔记。
2.这文章不是复制来的,是自己总结的,参考资料在末尾也加上了。之余HTML标签,iteye的那个添加代码功能我也不是很懂
3.题目是我搞错了,已经改过了
4.感谢大侠指出错误

1.抱歉,是我误会了,我还以为你是复制的时候把HTML复制过来还没有去审查删除掉。
2.俺并非大侠,愿共勉。
3.总结确实能给人启发,试想,如果在服务启动时加载饿汉模式的类,是不是饿汉模式远优于懒汉模式。

我觉得饿汉模式和懒汉模式的选用只是在时间和空间上权衡,我说懒汉模式线程不安全,是因为我添加同步块的时候,多个线程可以同时访问getInstance()方法~~。嘻嘻~~共同学习还是很开心的
3 楼 wengbo316 2015-05-04  
陌陌天使 写道
wengbo316 写道
妹纸,复制来的文章不能重新排版一下么,HTML标签没有去除掉。
另外你这篇讲的是懒汉模式,文不对题呀。
第三,懒汉模式并非线程不安全,而是你没有加同步块。

1.我是刚开始看设计模式,所以有些知识说的很不到位,所以拿出来交流,也算是笔记。
2.这文章不是复制来的,是自己总结的,参考资料在末尾也加上了。之余HTML标签,iteye的那个添加代码功能我也不是很懂
3.题目是我搞错了,已经改过了
4.感谢大侠指出错误

1.抱歉,是我误会了,我还以为你是复制的时候把HTML复制过来还没有去审查删除掉。
2.俺并非大侠,愿共勉。
3.总结确实能给人启发,试想,如果在服务启动时加载饿汉模式的类,是不是饿汉模式远优于懒汉模式。
2 楼 陌陌天使 2015-05-04  
wengbo316 写道
妹纸,复制来的文章不能重新排版一下么,HTML标签没有去除掉。
另外你这篇讲的是懒汉模式,文不对题呀。
第三,懒汉模式并非线程不安全,而是你没有加同步块。

1.我是刚开始看设计模式,所以有些知识说的很不到位,所以拿出来交流,也算是笔记。
2.这文章不是复制来的,是自己总结的,参考资料在末尾也加上了。之余HTML标签,iteye的那个添加代码功能我也不是很懂
3.题目是我搞错了,已经改过了
4.感谢大侠指出错误
1 楼 wengbo316 2015-05-04  
妹纸,复制来的文章不能重新排版一下么,HTML标签没有去除掉。
另外你这篇讲的是懒汉模式,文不对题呀。
第三,懒汉模式并非线程不安全,而是你没有加同步块。

相关推荐

    设计模式——单例模式

    是http://blog.csdn.net/lxq_xsyu/article/category/1544127博客中java设计模式的源代码。下载前请先看《设计模式——单例模式》一文。

    设计模式实现——单例模式

    对应博客讲解:http://blog.csdn.net/t1234xy4/article/details/52419546

    android开发设计模式之——单例模式详解

    单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到。比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenHelper)等都会用到单例...

    设计模式—— 七 :单例模式

    文章目录什么是单例模式?单例模式的实现饿汉式懒汉式线程安全的懒汉式登记式单例模式的优缺点单例...单例设计模式通用类图如下: 7-1:单例设计模式通用类图 Sngleton类称为单例类,通过使用private的构造函数确保

    设计模式(一)——单例模式

    懒汉式单例:第一次使用时才进行实例化。 应用:单例模式应用的非常广泛。我们经常遇到这样的场景,线程A和线程B对同一个对象执行操作,但是在A里面new了后,B里面不便取,使的A,B对象是同一个对象,我们就会使用...

    设计模式——小单例有大秘密

    单例模式大家并不陌生,也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗?今天我带大家一起来看看我眼中的单例,可能会跟你的认识有所不同。很容易看出,上面这段代码在多线程的情况下是...

    这可能是最全的单例模式了

    设计模式之——单例模式单例的几种实现1. 懒汉单例模式2. synchronized 修饰的懒汉单例模式3. 双重检查锁定的单例模式4. 静态内部类实现单例模式5. 饿汉实现单例模式6. 饿汉变种实现单例模式7. 枚举实现单例模式...

    C++设计模式原理与实战视频课

    C++设计模式原理与实战视频课 1-1 课程介绍 1-2 导论UML和设计模式导论 2-1 简单工厂方法的定义场景与实现-针对接口编程的设计思想剖析 2-2 简单工厂实用工程技术:C++对象动态创建技术与配置化开发 2-3 单例模式的...

    饮料商城系统源代码和报告(本次实验要求使用几种特定的设计模式,完成业务功能完整的应用程序)

    在本系统中,代理商类、可口可乐公司类和百事可乐公司类都使用到了代理模式,而且代理商类使用了懒汉式来实现单例模式,可口可乐公司类使用了饿汉式实现单例模式,而百事可乐类使用了双重检查锁来实现单例模式。...

Global site tag (gtag.js) - Google Analytics