设计模式(二)——单例模式

169 阅读2分钟

本文原创掘金:L_Sivan

单例模式定义

  • 确保对象在内存中有且只有一个,并自行实例化为系统提供这个实例。
  • 这个模式在我们只需要一个创建一个对象,避免重复创建对象的时候使用,比如说配置文件,工具类,缓存,线程池,日志对象等等
  • 单例模式属于创建类模式

实现方式一 饿汉模式

   //1.将构造函数私有化
    private SingleTon(){ }
    //2、内部调用构造函数创建对象,对象声明为私有属性
    // (饿汉模式的命名由此而来,因为SingleTon对象是static的,在加载SingleTon类的时候,instance对象就会被创建,无论有没有使用该对象,都会创建对象,就像饿汉去餐厅吃饭,无论吃不吃,先点了再说 )
    // final关键字确保该实例对象是内存中有且只有一个
    private final static SingleTon instance = new SingleTon();
    //3、提供方法获取singleTon实例
    public static SingleTon getInstance(){
        return instance;
    }

分析

将实例声明为static属性,在类被加载的时候就会创建实例,final属性确保了对象的唯一性。

实现方式二 懒汉模式

   //1.将构造函数私有化
    private SingleTon(){ }
    // 2.2、声明一个SingleTon对象,注意,是声明
    private static SingleTon instance = null;
     //3、提供方法获取singleTon实例
    public static SingleTon getInstance(){
        return instance;
    }

分析

这个一般叫做懒汉模式,因为是懒加载嘛,只有对象要被使用的时候才会实例化,但是这里就有一个问题了,假设在多线程的情况下,就会容易会创建多个实例,这不符合单例模式的定义,所以修改下

绝对安全的懒汉模式

   //1.将构造函数私有化
    private SingleTon(){ }
    // 2.2、声明一个SingleTon对象,注意,是声明
    private static SingleTon instance = null;
    // 3 在之前的基础上增加了synchronized关键字和一个instance判空
    public static synchronized SingleTon getInstance(){
	    if(instance == null){
		    Thread.sleep(1000);
		    instance = new SingleTon();
	    }
	    return instance;
    }

单例模式扩展:指定数量的对象

哈哈,在书上看到的,虽然不知道能不能用上,但是当做活跃下思维吧,觉得挺好玩的。

// 单例类
public class Singleton {
	private Singleton(String name){
		nameList.add(name);
	}
	// 对象的最大个数
	private static int maxNumOfSingleton = 3;
	//定义对象列表
	private static ArrayList<Singleton> singletonList = new ArrayList<Singleton>();
	// 定义对象的名字列表,方便知道是哪个对象
	private static ArrayList<String > nameList = new ArrayList<>();
	//当前对象的序号
	private static int countNum;
	static{
		// 实例化
		for(int i = 1;i<=maxNumOfSingleton;i++){
			singletonList.add(new Singleton(i +"号对象"));
		}
	}
	public static Singleton getInstance(){
		countNum = new Random().nextInt(maxNumOfSingleton);
		return singletonList.get(countNum);
	}
	public void say(){
		System.out.println("我是"+nameList.get(countNum));
	}
}
// 场景
public class Client {
	public static void main(String[] args) {
		for(int i =0;i<5;i++){
			Singleton.getInstance().say();
		}
	}
}
结果:
我是3号对象
我是3号对象
我是1号对象
我是2号对象
我是1号对象

以上就是单例模式