写在前面:
文中许多学习观点来自于龙哥--左潇龙博客。并非纯原创,在此仅为做笔记学习。
链接;http://www.cnblogs.com/zuoxiaolong/p/pattern2.html
在工作中,所有可以使用单例模式的类都有一个共性:
这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都一样的。更重要的一点是,这个类如果有两个或两个以上的实例的话,程序会产生程序错误或与现实相违背的逻辑错误。
这样的话,如果我们不将这个类控制成单例的结构,应用中就会存在很多一模一样的类实例,这会非常浪费系统的内存资源,而且容易导致错误甚至一定会产生错误,所以我们单例模式所期待的目标或者说使用它的目的,是为了尽可能的节约内存空间,减少无谓的GC消耗,并且使应用可以正常运作。
总结:一个类能否做成单例,最容易区别的地方就在于:这些类,在应用中如果有两个或俩个以上的实例会引起错误,又或者这些类在整个应用中,同一时刻有且只能有一种状态。
一、做成单例的几种方式:
第一种,最简单不考虑并发性的:
public class Singleton {
//一个静态的实例
private static Singleton singleton;
//私有化构造函数
private Singleton(){}
//给出一个公共的静态方法返回一个单一实例
public static Singleton getInstance(){
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
-------------------------------------------------------------------------------------------
这种方式通过以下几个地方来限制我们取到的实例是唯一的。
————————————————————————————————
1.静态实例,带有static关键字的属性在每一个类中都是唯一的。
2.限制客户端随意创造实例,即私有化构造方法,此为保证单例的最重要的一步。
3.给一个公共的获取实例的静态方法,注意,是静态的方法,因为这个方法是在我们未获取到实例的时候就要提供给客户端调用的,所以如果是非静态的话,那就变成一个矛盾体了,因为非静态的方法必须要拥有实例才可以调用。
4.判断只有持有的静态实例为null时才调用构造方法创造一个实例,否则就直接返回。
第二种,考虑并发性的。
具体看链接原文。