美文网首页
设计模式学习笔记——单例模式

设计模式学习笔记——单例模式

作者: codekun | 来源:发表于2016-03-19 20:39 被阅读31次

定义

单例模式(Singleton Pattern)是一个比较简单的模式,其定义如下:Ensure a class has only one instance, and provide a globalpoint of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)

通用代码

public class Singleton {
    private static final Singleton instance = new Singleton();

    // 限制产生多个对象
    private Singleton() {}

    // 通过该方法获得实例对象
    public static Singleton getInstance() {
        return instance;
    }

    public static void doSomething() {
    }
}

优点

  • 在内存中只有一个实例,不必频繁创建销毁,节约时空。
  • 避免对资源的多重占用
  • 可以在系统设置全局的访问点

缺点

  • 一般没有接口,扩展很困难
  • 在并行开发环境中,如果单例模式没有完成,是不能进行测试的
  • 单例模式与单一职责原则有冲突

使用场景

在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式。

饿汉式和懒汉式

上述通用代码为“饿汉式单例”,在一开始便初始化instance。还有一种“懒汉式单例”,在首次调用getInstance时初始化对象,但在高并发的情况下会出现线程同步问题,产生两个instance,方法是加入关键字synchronized。

实现代码如下:

public class Singleton {
    private static Singleton instance = null;

    // 限制产生多个对象
    private Singleton() {}

    // 通过该方法获得实例对象
    public static synchronized Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public static void doSomething() {
    }
}

注意事项

如果我们的一个单例对象在内存中长久不使用,JVM就认为这个对象是一个垃圾,在CPU资源空闲的情况下该对象会被清理掉,下次再调用时就需要重新产生一个对象。如果我们在应用中使用单例类作为有状态值(如计数器)的管理,则会出现恢复原状的情况,应用就会出现故障。如果确实需要采用单例模式来记录有状态的值,可以使用Spring框架中的bean让对象长久驻留内存。

其他探究

饿汉式在类装载时就会加载对象,而懒汉式每次进入getInstance方法都需要同步,浪费了许多判断时间。有没有一种实现方法能够同时改进这两个缺点呢?

我们可以利用JVM里的内部类来实现,保证线程安全性。代码如下:

public class Singleton {

    // 静态的成员式内部类,只有被调用到时才会加载
    private static class SingletonHolder {
        private static Singleton instance = new Singleton();

    }

    // 私有化构造方法
    private Singleton() {}

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }

    public static void doSomething() {

    }
}

相关文章

  • 【Java】设计模式 —— 深入浅出单例模式

    学习笔记 参考:深入浅出单实例SINGLETON设计模式单例模式【Java】设计模式:深入理解单例模式 场景:一般...

  • 设计模式之单例模式

    单例设计模式全解析 在学习设计模式时,单例设计模式应该是学习的第一个设计模式,单例设计模式也是“公认”最简单的设计...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • 设计模式整理(2) 单例模式

    学习《Android 源码设计模式解析与实践》系列笔记 什么是单例 单例模式是应用最广,也是最容易理解的模式之一。...

  • iOS-单例模式

    swift的单例设计模式 OC的单例设计模式 新学习一种单例思想

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • 设计模式系列教程之单例模式-原理介绍

    设计模式系列教程之单例模式-原理介绍 一:单例模式(Singleton)学习步骤 经典的单例模式原理: 本文出处:...

  • Android 中的 23 种设计模式

    系列笔记 通过学习 Android 的设计模式而记的笔记。(持续更新中...) 源码地址 Android 单例模式...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

网友评论

      本文标题:设计模式学习笔记——单例模式

      本文链接:https://www.haomeiwen.com/subject/pzbhlttx.html