`
zzq19860626
  • 浏览: 264495 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
B20df9e2-fb3d-3644-9f72-c1619842f682
设计模式学习笔记
浏览量:180044
87eaf24f-812a-3463-8e65-e3197d2ad8c2
java虚拟机
浏览量:26623
社区版块
存档分类
最新评论

JAVA设计模式学习7——单例模式

阅读更多

设计模式的创建模式中前面说了工厂模式,这里我们继续来讨论设计模式中另一个创建模式—单例模式。
单例模式(Singleton)是指确保一个类有且仅有一个实例,而且自行实例化并向整个系统提供这个实例。这个类我们也称它为单例类。单例模式的使用在现实世界里很多,比如我们常见的打印机打印的作业队列,一个没打印完,那么只有在队列等待;windows回收站,windows视窗里回收站有且只有一个实例。
单例模式的目的就是有且只提供一个实例,所以它有一下几个特点:
1、单例类只能有一个实例;
2、单例类必须自己创建自己惟一的实例;
3、单例类必须给所有其他对象提供这一实例。
单例模式的一般结构如下:


上图可以看出,单例类自己提供一个实例给自己。
由于java语言的特点在单例的实现上有不同的做法,主要体现在单例类如何实例化自己上。基于上面三个特点我们可以有两种创建单例类实例的方法,第一个是提前创建好,用的时候直接使用;第二种是等到使用的时候再创建实例,业界称第一种为饿汉式,后者成为懒汉式。

 

饿汉式单例设计模式

packagecom.pattern.singleton;
/**
 * 
 *【描述】:饿汉式单例模式
 *【作者】:alaric 
 *【时间】:Jul 8, 2012
 *【文件】:com.pattern.singleton.HungrySingleton.java
 *
 */
publicclass HungrySingleton {

//创建实例
private static final HungrySingleton singleton =new HungrySingleton();

//私有构造子
private HungrySingleton(){}

//静态工厂方法
public static HungrySingleton getInstance(){
    return singleton;
}

}

 懒汉式单例设计模式

packagecom.pattern.singleton;
/**
 * 
 *【描述】:懒汉式单例模式
 *【作者】:alaric 
 *【时间】:Jul 8, 2012
 *【文件】:com.pattern.singleton.LazySingleton.java
 *
 */
public class LazySingleton {

//创建实例
private static  LazySingleton singleton =null;

//私有构造子
private LazySingleton(){}

//静态工厂方法
synchronized public static LazySingleton getInstance(){
//如果为空就new一个实例
if(singleton==null){
     singleton =new LazySingleton();
}
return singleton;
}

}

 

 通过上面代码,可以看出他们之间的区别,相对而言单例设计模式比较简单,我们只要记住它的特点就可以简单掌握了。

 

 

设计模式系列目录:

  • 大小: 5 KB
6
6
分享到:
评论
20 楼 zzq19860626 2013-10-21  
hs1022 写道
是不是在getInstance()函数前面,您少加了一个static。不然你是不能调用getInstance()的。谢谢,如果说错了不要喷

恩,是的。改了一次丢了。谢谢提醒。
19 楼 dove19900520 2013-10-21  
hs1022 写道
是不是在getInstance()函数前面,您少加了一个static。不然你是不能调用getInstance()的。谢谢,如果说错了不要喷


恩,肯定是少了static关键字
18 楼 hs1022 2013-10-21  
是不是在getInstance()函数前面,您少加了一个static。不然你是不能调用getInstance()的。谢谢,如果说错了不要喷
17 楼 zzq19860626 2013-09-09  
QuarterLifeForJava 写道
能讲下登记式单例吗?貌似大家都不怎么讲啊.为什么?是不是他的适用范围很小啊?

单例根据是否延迟创建对象分两种:不延迟创建叫饿汉式,延迟创建叫懒汉式。登记式其实不是一种单例方式,只是根据需要对对象进行集中管理,类似于池技术或者享元模式的是用一样,进行单例共享。登记方式就是对单例对象进行管理的一种方式。
16 楼 QuarterLifeForJava 2013-09-09  
能讲下登记式单例吗?貌似大家都不怎么讲啊.为什么?是不是他的适用范围很小啊?
15 楼 zzq19860626 2013-08-03  
limaoyuan 写道
推荐看下单例模式的最好实现吧,用内部类控制或枚举:http://www.itexample.com/designpattern/single-instants/

学习了,内部类控制的很多,用枚举的倒是不多见。
14 楼 limaoyuan 2013-08-03  
推荐看下单例模式的最好实现吧,用内部类控制或枚举:http://www.itexample.com/designpattern/single-instants/
13 楼 zzq19860626 2013-07-18  
PV_love 写道
zzq19860626 写道
PV_love 写道
synchronized的时机有什么更好的方式么?第一次初始化了实例,剩下所有所有访问都要先加锁再判断是否对性能有一些影响呢?

这个问题很好,值得思考。不过在上面
synchronized public LazySingleton getInstance(){ 
//如果为空就new一个实例 
if(singleton==null){ 
    singleton =new LazySingleton(); 

return singleton; 

代码中,考虑过代码片段synchronized ,但是方法整体就很简单的逻辑,只是判断返回,所以就直接加方法了。


推荐读一下这篇文章
http://www.sunchis.com/html/java/basic/2013/0126/443.html


感觉ITEYE的回复真不好看

感谢  PV_love 推荐好文,推荐大家值得一看,分析的很深刻到位。
12 楼 PV_love 2013-07-18  
zzq19860626 写道
PV_love 写道
synchronized的时机有什么更好的方式么?第一次初始化了实例,剩下所有所有访问都要先加锁再判断是否对性能有一些影响呢?

这个问题很好,值得思考。不过在上面
synchronized public LazySingleton getInstance(){ 
//如果为空就new一个实例 
if(singleton==null){ 
    singleton =new LazySingleton(); 

return singleton; 

代码中,考虑过代码片段synchronized ,但是方法整体就很简单的逻辑,只是判断返回,所以就直接加方法了。


推荐读一下这篇文章
http://www.sunchis.com/html/java/basic/2013/0126/443.html


感觉ITEYE的回复真不好看
11 楼 zzq19860626 2013-07-18  
zh_harry 写道
单例有3个限制条件,缺一不可
1private static 对象本身
注意是static,即类存在时就对象已经存在,不存在个人觉得不存在多线程问题。
2private 构造函数,保证在类之外不能被实例化
3public static getInstance方法供外部调用。能够保证在进程中唯一实例。这也是与spring单例的区别

对,我在拷贝代码过来的时候发现代码黏在一块了。
10 楼 zzq19860626 2013-07-18  
PV_love 写道
synchronized的时机有什么更好的方式么?第一次初始化了实例,剩下所有所有访问都要先加锁再判断是否对性能有一些影响呢?

这个问题很好,值得思考。不过在上面
synchronized public LazySingleton getInstance(){ 
//如果为空就new一个实例 
if(singleton==null){ 
    singleton =new LazySingleton(); 

return singleton; 

代码中,考虑过代码片段synchronized ,但是方法整体就很简单的逻辑,只是判断返回,所以就直接加方法了。
9 楼 zh_harry 2013-07-18  
单例有3个限制条件,缺一不可
1private static 对象本身
注意是static,即类存在时就对象已经存在,不存在个人觉得不存在多线程问题。
2private 构造函数,保证在类之外不能被实例化
3public static getInstance方法供外部调用。能够保证在进程中唯一实例。这也是与spring单例的区别
8 楼 PV_love 2013-07-18  
synchronized的时机有什么更好的方式么?第一次初始化了实例,剩下所有所有访问都要先加锁再判断是否对性能有一些影响呢?
7 楼 平原少年mcs 2013-07-18  
6 楼 zh_harry 2013-07-18  
a3x60 写道
单例跟静态有什么区别?

存储位置不一样,static 是在静态区
单例是在堆里
5 楼 nichlas_yu 2013-07-18  
写的还不错,多线程中确实需要改进。
4 楼 zzq19860626 2013-07-18  
dove19900520 写道
这个貌似没有考虑安全性的问题吧!假如是在多线程中用到,你会怎么处理呢?

这个就是使用场景,如果考虑到多线程不安全,那说明单例的使用场景错了,单例本身就是为了始终保持有一个实例的。最常见的就是spring bean的配置,我们一般action都配置成prototype (原型)也就是多例的,而service往往就是默认的单例,这时候需要开发人员自己去解决多线程带来的线程安全问题,加锁或者同步。
3 楼 zzq19860626 2013-07-18  
a3x60 写道
单例跟静态有什么区别?

静态常量指类的变量,静态方式也指类的方法,是跟对象来区别的,在实际加载和内存中存放的位置不一样。单例只说它始终保持类的一个实例。
2 楼 a3x60 2013-07-18  
单例跟静态有什么区别?
1 楼 dove19900520 2013-07-18  
这个貌似没有考虑安全性的问题吧!假如是在多线程中用到,你会怎么处理呢?

相关推荐

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

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

    设计模式——单例模式

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

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

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

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

    单例模式是软件设计模式中的一种经典模式,它保证了类在任何情况下都只有一个实例存在。这个模式在很多场景下非常有用,例如控制全局资源、管理配置信息等。本文将详细探讨单例模式的懒汉式实现,并结合源码进行解析...

    java设计模式——单例模式

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

    Java设计模式源代码——自己看pdf写的

    以上只是部分Java设计模式的介绍,实际的“DesignPatterns”压缩包可能包含了这些模式的源代码实现,通过阅读和学习这些代码,开发者可以更好地理解和运用设计模式,提升代码质量。同时,结合博主提供的博客链接,...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

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

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

    java设计模式-单例.pdf

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

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

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

    设计模式-单例模式

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

    设计模式-Java语言中的应用(pdf)

    通过深入学习《设计模式——Java语言中的应用》,开发者能够更好地理解和应用这些模式,从而编写出更加高效、可扩展的Java程序。无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    JAVA设计模式.chm

    本资源“JAVA设计模式.chm”聚焦于一种重要的设计模式——工厂模式。工厂模式是面向对象设计中的一种经典模式,它在Java程序中扮演着核心角色。 工厂模式的核心思想是提供一个创建对象的接口,但让实现这个接口的类...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    Java与模式——源码

    《Java与模式——源码》这个主题涉及到的是Java编程语言中的设计模式应用,以及如何通过源代码来理解和学习这些模式。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更易读、易维护、...

    java 设计模式幽默解读

    "大牛解读Java设计模式.pdf"这本书籍,作为这个主题的载体,很可能是由资深专家撰写,用生动的语言和实例帮助读者理解抽象的设计概念,从而提升他们的编程技能。无论你是初学者还是有经验的开发者,都能从中受益匪浅...

Global site tag (gtag.js) - Google Analytics