从今天开始要好好花段时间学习一下最常用的几个设计模式;
首先学习一下单例模式(Singleton):单例模式的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个;下面看一下单例模式的UML类图:
看这个图比较简单,Singleton类中顶一个私有的singleton对象,和私有的构造方法,并且向外暴露一个public的getInstance()方法。这个方法来返回singleton对象。
下面直接看模拟代码:
第一种Singleton类的写法
class Singleton
{
//使用静态私有全局变量保存唯一的实例
private static Singleton singleton;
private Singleton()
{
}
/**
* 这里保证只会实例化一次,也就是第一次进行实例化,接下来继续调用就不会去实例化
* @return singleton
*/
public static Singleton getInstance()
{
if(null==singleton)
{
singleton=new Singleton();
}
return singleton;
}
}
从代码中进行分析,虽然我们要访问两次(下面的客户端代码是要创建两个实例)getInstance()方法,但是我们返回的是唯一的singleton实例。第一次我们去调getInstance()时会创建一个singleton实例,然后就一直存在于自身类当中,当我们再次去调用getInstance()方法的时候回去判断是否已经存在singleton实例了,存在的时候会直接返回原先已经创建好的singleton实例,这样就可以保证的实例的唯一性了。
第二种Singleton类写法:
class Singleton
{
private static Singleton singleton=new Singleton();
private Singleton()
{
}
public static Singleton getInstance()
{
return singleton;
}
}
下面是客户端代码:
/**
* 实现单例模式测试类
* @author jiangqq
*
*/
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1= Singleton.getInstance();
Singleton singleton2= Singleton.getInstance();
//返回true 即两个对象具有相同的
if(singleton1==singleton2)
{
System.out.println("singleton1和singleton2是同一个实例");
}
else
{
System.out.println("singleton1和singleton2不是同一个实例");
}
}
}
运行结果截图:
至于那种更加好嘛,我比较喜欢使用第一种,不过第一种有个弊端,是在多线程中,可能实现的实例不是唯一;这个时候我们可以通过加锁 lock()方法进行阻塞
总结一下单例模式的一些特点:
1:任何时候在类的程序周期之类只会唯一存在一个实例;
2:单例的类的构造函数是私有的,如果我要去获取单例的实例,必须去通过getInstance()来请求到实例;