专栏首页技术那些事【设计模式】之单例模式

【设计模式】之单例模式

把几年前写的一些文章,今天与大家分享下,或许几年写的文章过于幼稚、浅显,但望勿喷。

单例模式是23种设计模式中最简单、最常见的一种,也是各个公司面试题中必考的设计模式之一,是程序猿必备掌握的。

单例模式(Singleton Pattern):

确保某个类只有一个对象。单例类的构造器是私有的(private),避免外界利用构造器直接创建出任意多的实例。由于构造器是private的,因此单例类是不能被继承。

特点:

1>、单例类只能有一个实例。

2>、单例类必须自己创建自己的唯一实例。

3>、单例类必须给所有其他对象提供这一实例。

单例模式,可以形象的比作"一山不容二虎",如:计算机系统中,我们只需要他有一个唯一的实例在工作。无论一个电脑连接了多少台打印机,但是它的后台处理程序只有一个唯一的实例在工作,这样才不会出现混乱的交错情况。

单例模式分三种:懒汉式单例饿汉式单例登记式单例三种。

1、饿汉式单例

是一种典型的空间换时间的方式,在类进行加载时,我们静态实例对象就完成了实例化操作。操作时因为加载时已经实例化过了,操作速度会变快。但是因为类加载时这个对象就已经存在了,它的生命周期较长,占用空间。

package 单例模式;
/**
 * 饿汉式单例:自己将自己实例化
 * 在这个类被加载时,静态变量instance会被初始化,此时类的私有构造器被调用,这时单例类的唯一实例就被创建了。
 * @author xcbeyond
 * @date 2012-5-1 上午11:56:26
 */
public class EagerSingleton {
  private static final EagerSingleton instance = new EagerSingleton();
  //私有构造器
  private EagerSingleton() {
  }
  
  public static EagerSingleton getInstance() {
    return instance;
  }
}

2、懒汉式单例

与饿汉式单例不同的是,懒汉式单例类在第一次被引用时将自己实例化。如果加载器是静态的,那么在懒汉式单例类被加载时不会将自己实例化。

package 单例模式;
/**
 * 懒汉式单例
 * @author xcbeyond
 * @date 2012-5-1 下午12:23:54
 */
public class LazySingleton {
  private static LazySingleton instance = null;
  
  //私有构造器
  private LazySingleton(){
  }
  
  //静态工厂方法,返回此类的唯一实例
  synchronized public static LazySingleton getInstance () {
    if(instance == null ) {
      instance = new LazySingleton();
    }
    return instance;
  }
}

3、登记式单例

为了克服饿汉式单例类和懒汉式单例类不可继承的缺点,于是引入了登记式单例类。

package 单例模式;

import java.util.HashMap;

/**
 * 登记式单例类:克服了饿汉式和懒汉式单例类的不可继承的缺点。
 * @author xcbeyond
 * @date 2012-5-1 下午12:35:23
 */
public class RegisterSingleton {
   private static HashMap reg = new HashMap();
  
  static {
    RegisterSingleton x = new RegisterSingleton();
    reg.put(x.getClass().getName(), x);
  }
  
  //保护的默认构造器
  protected RegisterSingleton () {
    
  }
  
  //静态工厂方法,返回此类唯一的实例
  public static RegisterSingleton getInstance(String name) {
    if(name == null) {
      name = "RegisterSingleton";
    }
    if(reg.get(name)==null) {
      try{
        reg.put(name, Class.forName(name).newInstance());
      }catch(Exception e) {
        System.out.println("Error happened");
      }
    }
    return (RegisterSingleton)reg.get(name);
  }
}

饿汉PK懒汉

饿汉式,类加载时进行了对象的实例化创建,即使多个进程并发操作,访问的实例也是唯一的,饿汉式线程安全。

懒汉式,第一次使用才会实例化,多个线程并发操作时,由于时间片的切换,可能导致线程风险。

本文分享自微信公众号 - 程序猿技术大咖(cxyjsdk),作者:xcbey0nd

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【JVM系列】1.Java虚拟机内存模型

    Java虚拟机,简称JVM(Java Virtual Machine),是Java语言中最为核心的一个东西,Java程序运行离不开它,因为它的存在,使得...

    xcbeyond
  • JVM系列(一):Java虚拟机内存模型

    Java虚拟机,简称JVM(Java Virtual Machine),是Java语言中最为核心的一个东西,Java程序运行离不开它,因为它的存在,使得Java...

    xcbeyond
  • 详解分布式 ID 生成器

    图片.png整个结构是64位,所以我们在Java中可以使用long来进行存储。该算法实现基本就是二进制操作,单机每秒内理论上最多可以生成1024*(2^12),...

    xcbeyond
  • 单例模式详解

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对...

    孟君
  • 设计模式之单例模式(Singleton Pattern),太简单了

    单例模式就是确保某一个类只有一个实例,并且提供一个全局访问点。单例模式有如下几个特点:

    Java架构
  • 全栈必备 Java基础

    那一年,从北邮毕业,同一年,在大洋的彼岸诞生了一门对软件业将产生重大影响的编程语言,它就是——Java。1998年的时候,开始学习Java1.2,并在Java ...

    半吊子全栈工匠
  • stream流

    用户6510625
  • 为初学者打造的Fastai学习课程指南

    “学习Fastai从哪开始?”这个问题可能并不合适。那么是不是要直接看第一个视频?并不是。

    AiTechYun
  • 斯坦福CS231n项目实战(三):Softmax线性分类

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    红色石头
  • GoPro Omni太贵?4K全景VR相机Vuze或许是你的菜

    镁客网

扫码关注云+社区

领取腾讯云代金券