先来三个问题:
1.什么是单例模式?
2.为什么要使用单例模式,优点是什么
3.什么情况下适合使用单例模式
先来回答第1个问题:
由定义可以看到单例模式的特点:
1.单例类有且只能有一个实例
2.单例类必须自己创建自己的唯一的实例
3.单例类必须给所有其他对象提供该实例
第2个问题:为什么要使用单例模式,其优点是什么
查了一下stackOverflow上面的一些解答,无外乎几种:
1.
可以有效避免其他对象访问单例对象的副本,确保了所有对象都访问这唯一的资源
(PS:上面那句略拗口,有人举了一个很有意思的例子,例如,地球只有一个,为了保证你不是活在你自己new出来的地球上,那么只有使用单例模式,这样大家就可以共享同一个地球了。这种单例是自然而然的,比如要访问同一个打印机,写同一个日志文件,访问同一个配置文件等等)
因为类控制了实例化过程,所以类可以灵活更改实例化过程。(这句话不是特别明白,求解惑,不过解答者后面做了一个解释:you can change your mind and manage any number of instances.我觉得所谓的灵活性只是控制数量的话,简直弱爆了)
《java与模式》一书中,作者也对单例作了总结:
1.节约内存,有利于垃圾回收(GC)
2.可以通过线程同步来控制资源的并发访问
3.作为通信媒介使用,可在不建立直接关联条件下,让多个不相关的线程或进程实现通信
最后一个问题:
这个问题,噗~大牛们在stackOverFlow上吵得太热闹了,各说纷纭,但是人气最高的是:单例模式纯属扯淡,到现在也没有一个让人信服的理由(╯‵□′)╯︵┻━┻
大家还是看原帖吧,很有意思
http://stackoverflow.com/questions/228164/on-design-patterns-when-to-use-the-singleton
http://misko.hevery.com/2008/08/25/root-cause-of-singletons/
好了,虽然第三个问题有点搬石头砸自己脚的,还是硬着头皮往下讲吧
常用的单例模式有三种:恶汉模式,懒汉模式,登记模式
还有三种高大上的(今天先入门...):双重校验锁模式、枚举、静态内部类
1.恶汉模式
//恶汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { //私有的默认构造子 private Singleton1() {} //已经自行实例化 private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return single; } }
2.懒汉模式
//懒汉式单例类.在第一次调用的时候实例化 public class Singleton2 { //私有的默认构造子 private Singleton2() {} //注意,这里没有final private static Singleton2 single=null; //静态工厂方法 public synchronized static Singleton2 getInstance() { if (single == null) { single = new Singleton2(); } return single; } }
3.登记模式
import java.util.HashMap; import java.util.Map; //登记式单例类. //类似Spring里面的方法,将类名注册,下次从里面直接获取。 public class Singleton3 { private static Map<String,Singleton3> map = new HashMap<String,Singleton3>(); static{ Singleton3 single = new Singleton3(); map.put(single.getClass().getName(), single); } //保护的默认构造子 protected Singleton3(){} //静态工厂方法,返还此类惟一的实例 public static Singleton3 getInstance(String name) { if(name == null) { name = Singleton3.class.getName(); System.out.println("name == null"+"--->name="+name); } if(map.get(name) == null) { try { map.put(name, (Singleton3) Class.forName(name).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return map.get(name); } //一个示意性的商业方法 public String about() { return "Hello, I am RegSingleton."; } public static void main(String[] args) { Singleton3 single3 = Singleton3.getInstance(null); System.out.println(single3.about()); } }
这里看到构造函数都被封装成 非public,原因是很容易理解的:为了阻止其他对象创建实例(说好的单例)
相关推荐
**设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。单例模式的核心在于...
单例模式是软件设计模式中的一种经典模式,其主要目的是控制类的实例化过程,确保在任何情况下,一个类只有一个实例存在。这种模式通常用于管理共享资源或者全局配置,例如数据库连接池、线程池、日志服务等。在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)剖析单例模式的实现思路 我们从单例模式的概念(确保一个类只有一...
《设计模式1——单例模式详解》 设计模式是软件设计中的一种最佳实践,它是在特定情境下,解决常见问题的模板。本文主要探讨的是单例设计模式,一种限制类实例化次数的设计模式,确保一个类只有一个实例,并提供...