从今天开始要好好花段时间学习一下最常用的几个设计模式;
首先学习一下单例模式(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()来请求到实例;
本文出自 “江清清” 博客,请务必保留此出处http://2939716.blog.51cto.com/2929716/1376479