【单例模式】Java Singleton Design Pattern

【单例模式】Java Singleton Design Pattern_第1张图片
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加上锁,使得一次只能被同一线程访问。

你可能感兴趣的:(【单例模式】Java Singleton Design Pattern)