什么是单例模式?

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例场景,也就是说:确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象应该有且只有一个。

UML类图:

构建单例模式的关键:

1.构造函数不对外开放,一般为Private

2.通过一个静态方法或者枚举返回单例类对象

3.确保单例类的对象有且只有一个,尤其是多线程的环境下

4.确保单例类对象在反序列化时不会重新构建对象

单例模式构建方式:

1.饿汉模式

2.懒汉模式(Double Check)

3.静态内部类的单利模式

4.枚举单例模式

5.容器实现单例模式

代码示例:

1.饿汉模式

  1. public class Singleton {
  2. private Singleton(){
  3. }
  4. private static final Singleton Instance=new Singleton();
  5. public Singleton getInstance(){
  6. return Instance;
  7. }
  8. }

2. 懒汉模式(Double Check)

  1. public class Singleton {
  2. private Singleton(){
  3. }
  4. private static Singleton Instance=null;
  5. public Singleton getInstance(){
  6. if(Instance==null){
  7. synchronized (Singleton.class) {
  8. if(Instance==null)
  9. {
  10. Instance=new Singleton();
  11. return Instance;
  12. }
  13. }
  14. }
  15. return Instance;
  16. }
  17. }

3.静态内部类单例模式

  1. public class Singleton {
  2. private Singleton(){}
  3. private static Singleton getInstance(){
  4. return SingletonHolder.Instance;
  5. }
  6. /**
  7. * 静态内部类
  8. */
  9. private static class SingletonHolder{
  10. private static final Singleton Instance = new Singleton();
  11. }
  12. }

当第一次加载Singleton类时,并不会初始化Instance,只有在第一次调用Singleton的getInstance方法时,才会导致
Instance 被初始化。第一次调用 getInstance
方法会导致虚拟机加载SingletonHolder类,这种方式不仅能够确保线程安全,也能够保证单例对象的唯一性,同时也延迟了单例对象的实例化,所以推荐使用这种方法。

4.枚举单例

  1. public enum SingletonEnum{
  2. INSTANCE;
  3. public void doSomething(){
  4. System.out.println("do sth.");
  5. }
  6. }

5.使用容器实现单例模式

  1. public class SingletonManager {
  2. private static Map<String, Object> objMap = new HashMap<String, Object>();
  3. private SingletonManager(){ }
  4. //将多种单例类型注入到一个统一的管理类,在使用时根据key获取对象对应类型的对象
  5. public static void registerService(String key, Object instance)
  6. {
  7. if(!objMap.containsKey(key)){
  8. objMap.put(key, instance);
  9. }
  10. }
  11. public static Object getService(String key){
  12. return objMap.get(key);
  13. }
  14. }

这种容器单例模式的实现,在Android中,我们使用的Context的getSystemService(key)的方式,就是利用的容器单例模式。eg:WIndowsManagerService、ActivityManagerService等等。在虚拟机第一次加载该类时,会注册各种Service,这些服务以键值对的形式存储在一个HashMap中,用户使用时只需要根据key来获取到对应的具体服务对象了。

java单例模式实例的更多相关文章

  1. 用java单例模式实现面板切换

    1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...

  2. 【深入】java 单例模式(转)

    [深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...

  3. 深入Java单例模式(转)

    深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容 ...

  4. Java 单例模式的七种写法

    Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...

  5. java单例模式之懒汉式分析

    转自:http://blog.csdn.net/withiter/article/details/8140338 今天中午闲着没事,就随便写点关于Java单例模式的.其实单例模式实现有很多方法,这里我 ...

  6. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  7. 单例模式:Java单例模式的几种写法及它们的优缺点

    总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...

  8. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

  9. 你真的理解了java单例模式吗?讲别人都忽略的细节!

    前言:老刘这篇文章敢做保证,java的单例模式讲的比大多数的技术博客都要好,讲述别人技术博客都没有的细节!!! 1 java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上 ...

随机推荐

  1. js中parentNode,parentElement,childNodes,children

    首先了解parentNode,parentElement,childNodes,children四大属性之前,必须对Dom树有一定的了解,在Dom文档结构中,HTML页面每一部分都是由节点组成的,节点 ...

  2. P4186 【[USACO18JAN]Cow at Large G】

    思路是覆盖子树,我们发现,农民想截住牛的最优策略是不断向上来尽可能地覆盖更大的子树 我们想要尽早地覆盖一个子树,一个显然的贪心是在这个子树中选取深度最小的一个放农民 如果我们在一个点放置了农民,那么其 ...

  3. $.ajax的一些总结

    1.$.ajaxSetup()函数来全局设置    $.ajaxSetup({      url: "/xmlhttp/",      global: false,      ty ...

  4. **CI中的order_by在get_where之前

    public function show_list_by_order($array_data, $order_field, $order_mode) { $query = $this->db-& ...

  5. Java编程的逻辑 (1) - 数据和变量

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  6. docker commit 制作镜像

    docker commit -m="commit jdk" --author="gutianlangyu" ae56f6cad215 gutianlangyu/ ...

  7. Windows 系统采用批处理命令修改 ip 地址

    Windows 系统采用批处理命令修改 ip 地址 :: 设置IP地址 set /p choice=请选择设置类型(1:外网IP / 2:内网IP / 3:自动获取IP): echo. if &quo ...

  8. Java持久化之 -- 傲娇的NIO

    NIO: Jdk 1.4+ New IO 面向通道和缓冲区 所在包:java.nio 执行流程: 数据总数由通道写入到buffer , 或者是从buffer写入通道 完全替换IO(面向流  单向的) ...

  9. Xamarin iOS教程之申请付费开发者账号下载证书

    Xamarin iOS教程之申请付费开发者账号下载证书 Xamarin iOS使用真机测试应用程序 在讲解iOS Simulator时,已经提到了虽然iOS Simulator可以模仿真实的设备,但是 ...

  10. ZJOI2019day1退役记

    ZJOI2019day1退役记 每天都在划水,考场上心态炸了,也没什么好说的. 有人催我更退役记,等成绩出来了再更更吧,成绩出来也没心情更了,落差好大,还打不过文化课选手 虽然被卡常数卡到心态爆炸,但 ...