【单例模式】Java Singleton Design Pattern

Paste_Image.png
  • 单例模式用于限制一个类的对象个数,确保在JVM中只有一个类的对象。通常用于在应用程序中只有需要有一个全局对象的情形下。
  • 比如:Singleton pattern is used for logging, drivers objects, caching and thread pool
  • Singleton design pattern is used in core java classes also, for example java.lang.Runtime
    ,java.awt.Desktop.

单例模式的实现方法:

单例模式有不同的实现方法,但都遵循以下的步骤:

  1. 将构造方法私有化,防止其他类使用。
  2. private static的该类的唯一对象。
  3. 提供一个public static 的getInstance()方法供外界调用。
    大致就是以上的三个步骤,但是会根据对象实例化方式的不同而产生不同单例模式的实现方式。

单例模式的不同实现方法:

Eager initialization

package com.journaldev.singleton;
public class EagerInitializedSingleton {
private static final EagerInitializedSingleton instance = new EagerInitializedSingleton();
//private constructor to avoid client applications to use constructor
private EagerInitializedSingleton(){}

public static EagerInitializedSingleton getInstance(){
    return instance;
}
 }

优缺点:
--这是一种很简单的实现方法,当class被编译的时候,该对象就已经产生
-- 通过代码可以看出,这种实现的方式:在客户端调用之前已经对单例对象进行了实例化的操作。所以如果客户端应用不需要该对象的话那么就产生了一种浪费。
--所以,当我们使用单例的时候不需要操作很多资源的话,那么可以推荐使用这一种简单的创建方式。但是通常情况下,我们创建单例会使用系统的资源和文件,比如: File System, Database connections,此时我们应该选择在调用时才创建对象的单例模式。

Lazy Initialization##

package com.journaldev.singleton;

public class LazyInitializedSingleton {

private static LazyInitializedSingleton instance;
 
private LazyInitializedSingleton(){}
 
public static LazyInitializedSingleton getInstance(){
    if(instance == null){
        instance = new LazyInitializedSingleton();
    }
    return instance;
}
}
  • 这种模式的创建:知道客户端需要该对象的时候才会第一次被创建
  • 这种模式在单线程之下是安全的,但是当多线程的时候,多个线程同时对其 进行读写操作会可能会产生错误。

Thread Safe Singleton##

The easier way to create a thread-safe singleton class is to make the global access method synchronized, so that only one thread can execute this method at a time. General implementation of this approach is like the below class.
package com.journaldev.singleton;

public class ThreadSafeSingleton {

private static ThreadSafeSingleton instance;
 
private ThreadSafeSingleton(){}
 
public static synchronized ThreadSafeSingleton getInstance(){
    if(instance == null){
        instance = new ThreadSafeSingleton();
    }
    return instance;
}
 
}

--线程安全的单例模式比较简单的实现是对getInstance方法加上synchronized加上锁,使得一次只能被同一线程访问。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,312评论 4 34
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,546评论 1 8
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,823评论 18 399
  • 1 场景问题# 1.1 读取配置文件的内容## 考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相...
    七寸知架构阅读 6,896评论 12 68
  • 今天见了理工男了,呵呵。 其实很感谢宇宙,这段时间给了我很多好人了,我的实相已经开始改变了。 我也很感谢这个哥...
    猫公主喵阅读 700评论 0 0