写单例模式,总是让我想起孔乙己写“茴香豆”的茴的四种写法,虽然感觉他比较迂腐,但是在说到单例模式时,却也是忍不住的要说单例模式也有好几种写法,这样算来,自己也算迂腐了。不过不管怎样,既然是做技术的,多掌握一点也是比较好的,同时也将积累的分享给大家,大家各凭所好吧。
在说“茴”字之前,需要先说下什么是“茴香豆”,也就是我们的单例模式。单例模式就是让一个对象只产生一个实例,并且对外提供一个全局的方法对其进行调用,通常来说方法名都使使用getInstance()。
再来说说,单例模式的整体架构。
(1)私有的构造函数
(2)私有的静态实例,该实例禁止外部访问。
(3)一个公有的静态工厂方法getInstance(),有时是需要同步的。
(4)有时也可以重写clone()方法。
下面,再来说说,这个“茴”字有几种写法。
第一种,饿汉式,所谓饿汉式就是主动去new一个对象,然后返回。见代码:
/**
* 单例模式之饿汉式
* @author xiAoT
*
*/
public class Singleton001 {
private static Singleton001 instance = new Singleton001();
private Singleton001(){}
public static Singleton001 getInstance(){
return instance;
}
@Override
protected Singleton001 clone() throws CloneNotSupportedException {
return instance;
}
}
饿汉式的缺点是不论使不使用该类,都会在内存中实例化一个对象;优点是因为采用static类型,static本身实现了同步,所以解决了同步的问题,性能比较高,一般情况下推荐使用。
第二种,懒汉式,相当于延迟加载,在需要的时候再创建资源。
/**
* 单例模式之懒汉式
* @author xiAoT
*
*/
public class Singleton002 {
private static Singleton002 instance = null;
private Singleton002(){}
public synchronized static Singleton002 getInstance(){
if(instance == null){
instance = new Singleton002();
}
return instance;
}
}
由于采用了同步,在性能上会打折扣。
第三种,即采用缓存的方式,common.logutil中创建Log类就是采用这个方式,见LogFactory.java。基本实现方式就是用一个Map存放对象,需要使用的时候就从map中取,为了实现同步,我们一般用Hashtable存储。
/**
* 单例模式之采用缓存
* @author xiAoT
*
*/
public class Singleton003 {
private final static String CACHE_KEY = "instance";//定义一个key常量
private Singleton003(){}
private static Hashtable<String,Singleton003> cacheMap = new Hashtable<String, Singleton003>();
public synchronized static Singleton003 getInstance(){
Singleton003 instance = cacheMap.get(CACHE_KEY);
if(instance == null){
cacheMap.put(CACHE_KEY, instance = new Singleton003());
}
return instance;
}
}
第四种,这个方式就神了,即可以实现延迟加载,又能够节省资源,该方式主要采用类级内部类和多线程同步缺省机制实现。
如下几种情况,JDK内部实现了同步:
1. 有static{}修饰的块或者static修改的变量初始化数据;
2. 访问final字段时
3. 在创建线程之前创建对象时
4. 线程可以看见它将要处理的对象时
/**
* 单例模式之采用类级内部类和多线程同步缺省机制
* @author xiAoT
*
*/
public class Singleton004 {
/**
* 类级内部类
* @author xiAoT
*
*/
private static class SingletonHolder{
private static Singleton004 instance = new Singleton004();
}
private Singleton004(){}
public static Singleton004 getInstance(){
return SingletonHolder.instance;
}
}
类级内部类相当于外部类的成员,只有在第一次使用时才会被加载。
关于反序列化
如果采用了单例的类实现了序列化接口后,在进行反序列时,会自动创建新的类,为了解决这个问题,可以采用readResolve()方法
/**
* 反序列化
*
* @author xiAoT
*
*/
public class Singleton005 implements Serializable {
private Singleton005() {
}
private static final Singleton005 INSTANCE = new Singleton005();
public static Singleton005 getInstance() {
return INSTANCE;
}
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
}
======================================待续===============================
分享到:
相关推荐
**设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。单例模式的核心在于...
单例模式是软件设计模式中的一种经典模式,其主要目的是控制类的实例化过程,确保在任何情况下,一个类只有一个实例存在。这种模式通常用于管理共享资源或者全局配置,例如数据库连接池、线程池、日志服务等。在Java...
设计模式是软件工程中的一种最佳实践,用于解决在不同场景下重复出现的问题。...通过阅读提供的"iOS 设计模式——单例"相关资料,可以深入理解在iOS开发环境中如何有效利用单例模式来优化代码结构和提高程序性能。
单例模式是软件设计模式中的一种经典模式,它保证了类在任何情况下都只有一个实例存在。这个模式在很多场景下非常有用,例如控制全局资源、管理配置信息等。本文将详细探讨单例模式的懒汉式实现,并结合源码进行解析...
本次将聚焦于一种较为简单的模式——单例模式。 #### 单例模式概述 单例模式是一种创建型模式,它的核心在于确保某个类只有一个实例,并提供一个全局可访问的访问点。这种模式非常实用,尤其是在需要频繁地创建和...
单例的5中实现及反射和反序列化破解单例。
1)程序功能:单例模式设计Memcache和Redis操作类,采用PHP编写。 2)程序详解地址:http://blog.csdn.net/clevercode/article/details/46410055。 3)原创作品,出自"CleverCode的博客",分类为《设计模式之PHP项目...
C++设计模式——单例模式-附件资源
单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到。比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenHelper)等都会用到单例...
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在iOS应用开发中,单例模式被广泛用于管理共享资源、实现全局设置、提供网络请求管理器等场景。让我们深入探讨一下单例模式在iOS...
【Java设计模式——单例模式】 单例模式是一种常见的软件设计模式,它的核心思想是确保在应用程序的整个生命周期中,某个类只有一个实例存在。这种模式主要用于控制类的实例化过程,减少系统资源的消耗,提高系统...
策略模式和单例模式是软件设计中两种非常重要的设计模式,它们在实际开发中有着广泛的应用。在这篇文章中,我们将深入探讨这两种模式的核心概念、实现方式以及如何在实际项目中运用。 策略模式是一种行为设计模式,...
我们经常遇到这样的场景,线程A和线程B对同一个对象执行操作,但是在A里面new了后,B里面不便取,使的A,B对象是同一个对象,我们就会使用单例模式了。在Android中我们常用于数据库操作,蓝牙命令控制,以及一些工具...
从单例模式的定义中我们可以看出——单例模式的使用自然是当我们的系统中某个对象只需要一个实例的情况,例如:操作系统中只能有一个任务管理器 2)剖析单例模式的实现思路 我们从单例模式的概念(确保一个类只有一...
本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...