单例模式


版权声明


单例模式概述

对于系统中的某些类来说,只有一个实例很重要。

如果打开的Windows窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

如何保证一个类只有一个实例并且这个实例易于被访问呢?
定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。 这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。

单例模式的要点有三个:

一是某个类只能有一个实例(对象)
二是它必须自行创建这个实例
三是它必须自行向整个系统提供这个实例

单例模式的目的:保证该类只有一个对象。

第一步:把构造方法私有
第二步:在成员位置自己创建一个对象(即创建一个成员变量)
第三步:通过一个公共的方法提供访问
单例模式思路:
  1. 构造函数私有化
    如果要保证一个类不能被多次实例化,只对类进行一次实例化,那么我们就要阻止对象被new出来(即被创建新的对象),使其它类都直接获取第一次实例化的对象,所以就需要把类的构造函数私有化。

  2. 创建一个成员变量
    定义属性,赋值为空,使用private,让这个属性为这个类所私有,让其他类无法调用

  3. 通过一个公共的方法提供访问(以静态的方法返回实例)
    当我们把类的构造函数私有之后,其它类就不能通过new来获得对象(从而不能对对象作出改变),所以我们要通过提供一个公共的方法来让外界获取对象实例。


分析实现

单例模式主要作用是保证在Java应用程序中,一个类class只有一个实例存在。
一般单例模式通常有两种形式:

一、懒汉式

//一个类只能创建一个对象
//懒汉式

public class SingleInstance {

	// 使用private,让这个属性为这个类所私有,让其他类无法调用
	// 使用static,让其能在进入内存时能优先得到执行,
	private static SingleInstance mSingleInstance = null;

	// 创建空的构造函数,将public改为private,这样就将空的构造函数改为此类私有
	// 如此别的类就不能new出对象
	private SingleInstance() {// 构造函数私有化

	}

	// 创建一个方法,外部可以通过这个方法来访问此类,所有用public进行修饰
	// 使用static是为了以静态的方法来返回实例
	// 使用static的原因:没有对象,无法通过对象来调用此方法,所以需要用类去调用此方法,类调用的方法必须用static修饰
	// 因为已经将空的构造函数改为了此类私有的函数,所以其它类就不能创建对象,这样就只能通过此公共的方法进行访问
	public static SingleInstance getSingle() {

		// if判断mSingleInstance为空时,new出对象为其赋值
		if (mSingleInstance == null) {
			mSingleInstance = new SingleInstance();

		}
		return mSingleInstance;
	}
}

二、饿汉式

public class Singleton {

	// 在自己内部定义自己的一个实例,只供内部调用
	// 定义这个类型的变量并声明对象将值赋给它
	private static final Singleton instance = new Singleton();// 饿汉式

	private Singleton() {

	}

	// 这里提供了一个供外部访问本class的静态方法,可以直接访问
	public static Singleton getInstance() {

		return instance;
	}

}

备注:
SingleInstance 单实例模式
Singleton 单例

编写代码,比如类名、方法名时须“见名知意”。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值