剑指offer面试题2,java实现

刚开始看到了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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/107645842