再孬再好,就你一个
单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
单例类限制类的实例个数,保证类的实例在JVM的世界里只有一个类的实例对象。
单例类必须自己创建自己的唯一实例。
单例类必须提供一个全局性的公共访问方式获取单例类的实例对象
单例类必须给所有其他对象提供这一实例。
介绍
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
应用场景: java.lang.Runtime类、日志、驱动器、缓存、线程池等l
实现
我们将创建一个 SingleObject 类。SingleObject 类有它的私有构造函数和本身的一个静态实例。
SingleObject 类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo,我们的演示类使用 SingleObject 类来获取 SingleObject 对象。
步骤 1
创建一个 Singleton 类,SingleObject.java
public class SingleObject {
//创建 SingleObject 的一个对象
private static SingleObject instance = new SingleObject(0);
//让构造函数为 private,这样该类就不会被实例化
private SingleObject(int i){
System.out.println("我是一个单例"+i);
}
//获取唯一可用的对象
public static SingleObject getSingletonInstance(){
return instance;
}
public void showMessage(String msg){
System.out.println("我是一个单例的方法调用,"+msg);
}
}
步骤 2
从 singleton 类获取唯一的对象,测试类SingletonPatternDemo.java
/**
*
* @author dgm
* @describe "测试单例模式"
* @date 2020年5月13日
*/
public class SingletonPatternDemo {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
// 不合法的构造函数
// 编译时错误:构造函数 SingleObject() 是不可见的
// SingleObject object = new SingleObject();
// 获取唯一可用的对象
SingleObject object = SingleObject.getSingletonInstance();
// 显示消息
object.showMessage("正常流程");
}
}
输出效果:
我就一一列举:
1. 饿汉式初始化 Eager initialization
在饿汉初始化模式下,单例类的实例是在类加载的时候完成了创建,这是最简单的创建单例的方式,但它有个缺陷就是客户端还没使用已创建好的单例实例。下面就是实现了静态初始化的单例类
/**
*
* @author dgm
* @describe "饿汉式初始化单例"
*/
public class EagerInitializedSingl