Java 设计模式 ——单例模式(饿汉,懒汉,双重锁,静态内部类)

设计模式:
是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱 俗称”套路“

单例模式
所谓类的单例模式 就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象 我们首先必须将类的构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类的内部仍然可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法 以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以 指向类内部产生的该类对象的变量也必须定义成静态的。

具体写法如下(4种)
1.单例(Singleton)设计模式 - 饿汉式

class Singleton{
	//1.私有化构造方法
	private Singleton(){
	}
	//2.类的内部提供一个当前类的实例
	//4.此实例也必须静态化
	private static Singleton single = new Singleton();
	//3.提供公共的 静态的 get方法
	public static Singleton getInstance(){
		return single;
	}
}

此种方法是饿汉式
特点: 不管是否用到 先new一个新的实例

2.单例(Singleton)设计模式 - 懒汉式

class Singleton{
	//1.私有化构造方法
	private Singleton(){
	}
	//2.类的内部先声明当前类
	//4.必须静态化
	private static Singleton single;

	//3.提供公共的静态的 get方法
	public static Singleton getInstance(){
		//判断当前实例是否为null
		if(single == null){
			//如果为null,则new一个实例
			single = new Singleton();
		}
		
		return single;
	}
	
}

懒汉式
特点:先声明实例 当用到时再new出实例 线程不安全

3.单例(Singleton)模式 - 双重锁式

class Singleton{
	//1.提供私有的构造方法
	private Singleton(){
	}
	//2.声明实例
	private volatile static Singleton single;

	//3.提供公共的 静态的 get方法
	public static Singleton getInstance(){
		if(single == null){
			synchronized(Singleton.class){
				if(single == null){
					single = new Singleton();
				}
			}
		}
		return single;
	}

}

双重锁式: 重写了懒汉式,线程安全

4.单例(Singleton)模式 - 静态内部类式

class Singleton{
	//1.提供私有的构造方法
	private Singleton(){
	}

	//2.创建静态内部类
	class StaticSingleton{
		//3.类中实例化外部类的对象,用static final修饰  
		//final 修饰对象 此对象不能再new实例
		private static final Singleton single = new Singleton();
		
	}
	//4.提供公关的 静态的 get方法 获取内部类中的外部类实例对象
	public static Singleton getInstance(){
		return StaticSingleton.single;
	}

}

测试方法:
通过单例模式设计的类 无论实例化几次 在内存中都会只想一个地址

实例化方法:

Singleton single = Singleton.getInstance();

验证方法:

Singleton single1 = Singleton.getInstance();
Singleton single2 = Singleton.getInstance();
System.out.println(single1 == single2);

如果输出结果为 true 则表示内存地址相等 设计成功

你可能感兴趣的:(Java 设计模式 ——单例模式(饿汉,懒汉,双重锁,静态内部类))