刚开始看到了Singleton模式的时候,不知道题目要求我实现什么,因此特地去查了一下,发现是要我们实现单例模式。
单例模式:单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
第一次实现,这种实现不适用于多线程,不能保证线程安全
public class Singleton {
private static Singleton Instance = null;
private int item = 123;
private Singleton() {
}
//必须要加static,因为要在没有对象的条件下使用这个方法。
public static Singleton getSingleton() {
if(Instance == null) {
Instance = new Singleton();
}
return Instance;
}
public int getItem() {
return this.item;
}
}
第二次实现,这种实现适用于多线程,加了锁,但是其实单例模式的类的对象只会被创建一次,其他时候只是调用这个对象,并不需要加锁,而加锁又是一个很耗时的步骤,因此有了第三次实现
public class Singleton {
private static Singleton Instance = null;
private String item = "123";
private Singleton() {
}
//必须要加static,因为要在没有对象的条件下使用这个方法。
public static synchronized Singleton getSingleton() {
if(Instance == null) {
Instance = new Singleton();
}
return Instance;
}
public String getItem() {
return this.item;
}
}
第三次实现
package com.java.offer.one;
public class Singleton {
private static Singleton Instance = null;
private String item = "123";
private Singleton() {
}
//必须要加static,因为要在没有对象的条件下使用这个方法。
public static synchronized Singleton getSingleton() {
if(Instance == null) {
// public void method()
// {
// synchronized(this) {
// // todo
// }
// }
// Singleton.class生成class对象
synchronized(Singleton.class) {
//若另一个线程执行到了锁里面,而另一个线程通过了前一个为空判断,那么,没有锁内判断的程序会再次创建instance实例。
if(Instance == null) {
Instance = new Singleton();
}
}
}
return Instance;
}
public String getItem() {
return this.item;
}
}
第四次实现
//这种方式同样利用了 classloader 机制来保证初始化 instance 时只有一个线程,
//这种方式是 Singleton 类被装载了,instance 不一定被初始化。
//因为 SingletonHolder 类没有被主动使用,只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,
//从而实例化 instance。
public class Singleton {
private static Singleton Instance = null;
private String item = "123";
private Singleton() {
}
private static class SingletonHolder {
//final修饰,为常量
private static final Singleton Instance = new Singleton();
}
//必须要加static,因为要在没有对象的条件下使用这个方法。
public static final Singleton getSingleton() {
return SingletonHolder.Instance;
}
public String getItem() {
return this.item;
}
}
第五种方法
public enum Singleton {
// 理解: INSTANCE是DemoEnum的实例.
INSTANCE;
private User instance;
public void otherMethods() {
System.out.println("Something");
}
// 枚举类的私有构造方法. 默认是private的.
Singleton(){
instance = new User();
}
public User getInstance() {
return instance;
}
}