- 单例模式用于限制一个类的对象个数,确保在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.
单例模式的实现方法:
单例模式有不同的实现方法,但都遵循以下的步骤:
- 将构造方法私有化,防止其他类使用。
- private static的该类的唯一对象。
- 提供一个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加上锁,使得一次只能被同一线程访问。