单例(Singleleton)设计模式
这篇比较短的文章简单的介绍如何完成单例设计。
1.1 单例设计模式产生的原因
在大部分时候,我们把类的构造器定义为public访问权限,允许任何类自由创建该类对象。但在某些时候,允许其他类自由创建该类对象没有任何意义。有时候根据需要,对某个类而言只能创建一个对象,那么这个类就称为单例类,这种模式叫做单例设计模式。
1.2 如何设计单例
(1)为了防止其他类自由创建该类,我们需将其构造器隐藏起来:构造器访问权限设置为private。
(2)由于缺少构造器,其他类不能像通常情况下使用new关键字来创建该类对象,单例类就需要对外提供一个方法用以返回该类对象,由于没有对象调用,这个方法只能通过类来访问,这个方法要设计为类方法(用static关键字修饰)
(3)为了保证只创建一个对象,要在单例类本身创建本类对象。
下面来看看代码是如何实现的
public class Single
{
//构造函数私有化,防止无限制新建对象
private Single()
{}
//在类中建立本类对象
private static Single s = new Single();
/*
提供一个返回本类对象的方法,由于构造函数的私有化,无法用
new来新建对象,想要此方法,只能添加关键字static,通过类名
来访问
*/
public static Single getInstance()
{
return s;
}
public static void main(String args[])
{
Single ss = Single.getInstance();
}
}
这种方式称为恶汉式。在类完成加载时,就创建了该类对象。
下面这段代码是另外一种实现方式,原理相同:
(1)隐藏构造函数
(2)创建本类对象
(3)对外提供公共方法,返回该对象
具体实现如下:
public class Singleton
{
//私有化构造器
private Singleton(){}
//创建私有属性有来缓存本类对象
private static Singleton instance;
//对外提供方法,返回该类对象
public static Singleton getInstance()
{
if(instance == null)
instance = new Singleton();
return instance;
}
public static void main(String args[])
{
//两次调用方法创建对象
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
/*由于没有重写,equals 方法比较的是两个引用所指向的地址值,
即比较两者是否指向同一个对象
*/
System.out.println(s1.equals(s2));
}
}