文档章节

java23中设计模式——创建模式——singleton(单列)

邓竣
 邓竣
发布于 2016/03/18 17:34
字数 636
阅读 4
收藏 0

Singleton 模式主要作用是保证在 Java 应用程序中,一个类 Class 只有一个实例存在。   

在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。 

还有, singleton 能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样

向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持

住这个计数,并且能 synchronize 的安全自动加 1,如果你要把这个数字永久保存到数据

库,你可以在不修改单态接口的情况下方便的做到。 

另外方面,Singleton 也能够被无状态化。提供工具性质的功能, 

 

Singleton 模式就为我们提供了这样实现的可能。使用 Singleton 的好处还在于可以节

省内存,因为它限制了实例的个数,有利于 Java 垃圾回收(garbage collection)。 

 

我们常常看到工厂模式中类装入器(class loader)中也用 Singleton 模式实现的,因为

被装入的类实际也属于资源。 

如何使用? 

一般 Singleton 模式通常有几种形式: 

public class Singleton { 

   private Singleton(){} 

   //在自己内部定义自己一个实例,是不是很奇怪? 

   //注意这是 private 只供内部调用 

   private static Singleton instance = new Singleton(); 

   //这里提供了一个供外部访问本 class 的静态方法,可以直接访问        public static Singleton getInstance() { 

     return instance;     

    }  

}  

  

第二种形式: 

public class Singleton {  

   private static Singleton instance = null; 

 

   public static synchronized Singleton getInstance() { 

 

   //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次          

   //使用时生成实例,提高了效率! 

   if (instance==null) 

     instance=new Singleton(); 

   return instance;    }  

}  

  

使用 Singleton.getInstance()可以访问单态类。 

上面第二中形式是 lazy initialization,也就是说第一次调用时初始 Singleton,

以后就不用再生成了。 

注意到 lazy initialization 形式中的 synchronized,这个 synchronized 很重

要,如果没有 synchronized,那么使用 getInstance()是有可能得到多个 Singleton实例。关于 lazy initialization 的 Singleton 有很多涉及 double-checked 

locking (DCL)的讨论,有兴趣者进一步研究。 

一般认为第一种形式要更加安全些。 


© 著作权归作者所有

邓竣
粉丝 2
博文 30
码字总数 43557
作品 0
成都
程序员
私信 提问
设计模式1——Singleton设计模式

Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序运行生命周期中,使用了单例模式的类只能有一个实例对象存在。单例模式实现了类似C语言中全局变量的功能,单例模式常用于注册...

小米米儿小
2013/12/05
0
0
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
设计模式C#描述——单例与多例模式

设计模式C#描述——单例与多例模式 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 单例模式有以下特点: 单例类只能...

晨曦之光
2012/03/09
61
0
《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式

在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方...

嗨呀豆豆呢
2018/12/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

idea运行spring boot(推荐)

下载idea 注册激活:http://idea.lanyus.com/ 照着网上的步骤创建spring boot,这里记录存在的坑 首先gradle需要在本地配置环境变量,配制成本地的,联网下载的话要很久很久 第一次不要使用g...

安卓工程师王恒
32分钟前
2
0
java final学习笔记

代码如下:class Circle{ double r; double pi=3.14; public Circle(double r) { this.r=r; } public void getArea() { System.out.......

hellation_
50分钟前
1
0
JavaConfig版

中心思想:去xml配置文件。 在Spirng Boot和Spring Cloud中,大量使用了注解与JavaConfig。 xml文件 对应的Java类 spring.xml SpringConfig.java spring-mvc.xml SpringMvcConfig.java web.x...

流小文
今天
6
0
Go 定时器内部实现原理剖析

前言 前面我们介绍了一次性定时器Timer和周期性定时器Ticker,这两种定时器内部实现机制相同。创建定时器的协程并不负责计时,而是把任务交给系统协程,系统协程统一处理所有的定时器。 本节...

恋恋美食
今天
6
0
分布式协调神器 ZooKeeper 之整体概述

ZooKeeper 最早起源于雅虎研究院的一个研究小组。当时,雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的开发人员就...

别打我会飞
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部