设计模式——单例模式

java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例
  单例模式有以下特点:

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。
package com.yzy.designpatterns;

/**
 * @className TestSingletton.java
 * @author yangsir
 * @version V1.0
 * @date 2019年8月19日-上午10:41:01
 * @description
 *饿汉式(建议用)
 */
public class TestSingletton {
	public static void main(String[] args) {
		Singletton s1 = Singletton.getInstance();// 静态方法通过类名.方法来调用
		Singletton s2 = Singletton.getInstance();
		System.out.println(s1 == s2);// true,说明创建的是一个对象
	}
}

//创建一个单例类,保证这个类只能创建一个对象
class Singletton {
	// 私有化构造器
	private Singletton() {

	}

	// 在类的内部创建一个私有静态对象,为了不让主方法创建对象
	private static Singletton single = new Singletton();

	// 给一个public权限的静态方法来返回这个对象
	public static Singletton getInstance() {
		return single;

	}

	// 属性
	// ...

	// 方法
	// ...
}

package com.yzy.designpatterns;

/**
 * @className TestSingletton2.java
 * @author yangsir
 * @version V1.0
 * @date 2019年8月19日-上午10:52:50
 * @description
 *2.懒汉式(线程安全问题,可以通过同步锁解决)
 */
public class TestSingletton2 {
	public static void main(String[] args) {
		Singletton2 s1 = Singletton2.getInstance();// 静态方法直接通过类名.方法来调用
		Singletton2 s2 = Singletton2.getInstance();
		System.out.println(s1 == s2);// true 说明创建的是一个对象
	}
}

//创建一个单例类,保证这个类只能创建一个对象
class Singletton2 {
	// 私有化构造器
	private Singletton2() {

	}

	// 创建一个私有静态对象为空
	private static Singletton2 single = null;

	// 创建一个public 静态的方法来访问上面创建的对象
	public static Singletton2 getInstance() {
		// 如果为空就创建
		if (single == null)
			single = new Singletton2();
		return single;
	}

	// 属性
	// ...

	// 方法
	// ...
}

优点

  1. 实例控制

单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

  1. 灵活性

因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点

  1. 开销

虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。

  1. 可能的开发混淆

使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

  1. 对象生存期

不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。

你可能感兴趣的:(java,设计模式,单例模式,javaSE)