`
陌陌天使
  • 浏览: 22572 次
  • 性别: 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标签没有去除掉。
另外你这篇讲的是懒汉模式,文不对题呀。
第三,懒汉模式并非线程不安全,而是你没有加同步块。

相关推荐

    设计模式——单例模式

    **设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...

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

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。单例模式的核心在于...

    java设计模式之——单例模式

    单例模式是软件设计模式中的一种经典模式,其主要目的是控制类的实例化过程,确保在任何情况下,一个类只有一个实例存在。这种模式通常用于管理共享资源或者全局配置,例如数据库连接池、线程池、日志服务等。在Java...

    java设计模式——单例模式

    【Java设计模式——单例模式】 单例模式是一种常见的软件设计模式,它的核心思想是确保在应用程序的整个生命周期中,某个类只有一个实例存在。这种模式主要用于控制类的实例化过程,减少系统资源的消耗,提高系统...

    设计模式——策略模式 & 单例模式

    策略模式和单例模式是软件设计中两种非常重要的设计模式,它们在实际开发中有着广泛的应用。在这篇文章中,我们将深入探讨这两种模式的核心概念、实现方式以及如何在实际项目中运用。 策略模式是一种行为设计模式,...

    设计模式之单例模式Java实现和类设计图

    本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...

    设计模式-单例模式

    **设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...

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

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

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

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

    java设计模式-单例.pdf

    ### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...

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

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

    设计模式——刘伟

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...

    三种工厂设计模式和两种单例模式

    在本文中,我们将深入探讨三种工厂设计模式——简单工厂模式、抽象工厂模式和工厂方法模式,以及两种单例模式——饿汉单例模式和懒汉单例模式。这些模式都是面向对象设计中的重要组成部分,对于理解和构建可维护、可...

    设计模式——单实例模式、单件模式——Java编写

    单实例模式是软件设计模式中的一种,它的核心思想是确保一个类在整个系统运行过程中只有一个实例存在,并提供一个全局访问点,以保证所有对该类对象的访问都指向这个唯一的实例。这种模式在Java中广泛应用于配置管理...

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

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

    工厂模式与单例模式

    在软件设计模式中,工厂模式和单例模式是两种非常基础且重要的模式,它们都是用于解决对象创建问题,但有着不同的设计理念和应用场景。本篇文章将深入探讨这两种模式,并结合具体的代码示例`myFactoryDemo`进行讲解...

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

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

Global site tag (gtag.js) - Google Analytics