《二十三种设计模式》通俗的创建型之单例设计模式

概念

单例模式(Singleton Pattern)是Java中最简单的设计模式之一。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

举例:

一个人只有一个嘴巴,当你说话时(调用方法时)永远只能使用一个嘴巴,如果不使用单例设计模式,每一次说话都会多出来一张嘴(实例化一个对象),这就不合理且占用资源

实现

最基础

懒汉式

懒汉时懒汉两字就代表了一切,当真正用到时才临时泡佛脚

实现:
public class Singleton{
	private static singleton = null; 
	public getSingleton(){
		if(singleton==null){
			singleton = new Singleton();
		}
		return singleton;
	}
	private Singleton(){
	//私有无参构造器,只允许内部调用
	}
}

我们可以看出,只有在使用时才会进行实例化,就是懒汉式

俄汉式

同上两字就代表了一切,加载时就实例化类

实现:
public class Singleton{
	private static singleton = new Singleton(); 
	public getSingleton(){
		return singleton;
	}
	private Singleton(){
	//私有无参构造器,只允许内部调用
	}
}

只要整个项目加载就会进行实例化,就想一个人饿了,不管三七二十一,先吃了再说

关于以上两种的优劣

懒汉式不浪费内存,但线程不安全(多线程获取时,可能会示例话多个对象,因为可能有多个线程同时通过if判断)
饿汉式浪费内存,但线程安全

解决线程安全:

  1. 双重检测锁(两个锁保证安全,但可能因为虚拟机原因出现问题,不推荐)
  2. 推荐使用静态内部类或静态块,两者相似,这里以静态块为例
public class Singleton{
	static{
		singleton = new Singleton();
	}
	private static singleton;
	public getSingleton(){
		return singleton;
	}
	private Singleton(){
	//私有无参构造器,只允许内部调用
	}
}

为什么要使用静态块?
因为静态块只会在类加载时调用一次,详细见jvm底层

posted @ 2021-10-03 20:41  MD&One-AR  阅读(39)  评论(0)    收藏  举报