一、单例模式
首先,什么是单例模式?
单例模式的定义是:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
特征:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
二、单例模式有何用?如何实现?
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对
象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以
有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到
打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避
免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致
状态,避免政出多头。
•要想控制一个类只被创建一个实例,那么首要的问题就是要把创建实例的权限收回来,
让类自身来负责自己类实例的创建工作,然后由这个类来提供外部可以访问这个类实
例的方法,这就是单例模式的实现方式。
三、两种方法
1.懒汉式
所谓懒汉式,既然是懒,那么在创建对象实例的时候就不着急,会一直等到马上要使
用对象实例的时候才会创建,因此在装载对象的时候不创建对象实例,写法如下:
private static Singleton uniqueInstance = null;
而是等到第一次使用的时候,才去创建实例,也就是在getInstance方法里面去判断和创建。
2.饿汉式
所谓饿汉式,既然饿,那么在创建对象实例的时候就比较着急,饿了嘛,于是就在装载类的
时候就创建对象实例,写法如下:
privatestatic Singleton uniqueInstance = new Singleton();
四、具体创建
1.懒汉式
•1)私有化构造方法
•private Singleton(){ }
•2)提供获取实例的方法并将它变成静态的
•public static Singleton getInstance(){ }
•3)定义存储实例的属性并定义成静态的
•private static Singleton instance = null;
•4)实现控制实例的创建
代码
•public static Singleton getInstance(){
• //先判断instance是否有值
• if(instance == null){
• //如果没有值,说明还没有创建过实例,那就创建一个
• //并把这个实例设置给instance
• instance = new Singleton ();
• } //如果有值,或者是创建了值,那就直接使用
• return instance;
•}
•public class Singleton {
• //4:定义一个变量来存储创建好的类实例
• //5:因为这个变量要在静态方法中使用,所以需要加上static修饰
• private static Singleton instance = null;
• //1:私有化构造方法,便于在内部控制创建实例的数目
• private Singleton(){
• }
• //2:定义一个方法来为客户端提供类实例
• //3:这个方法需要定义成类方法,也就是要加static
• public staticSingleton getInstance(){
• //6:判断存储实例的变量是否有值
• if(instance== null){
• //6.1:如果没有,就创建一个类实例,并把值赋给存储类实
• 例的变量
• instance= new Singleton();
• }
• //6.2:如果有值,那就直接使用
• returninstance;
• }
•}
2.饿汉式
这种方案跟第一种方案相比,前面的私有化构造方法,提供静态的
getInstance方法来返回实例等步骤都一样。差别在如何实现
getInstance方法
•public class Singleton {
•//4:定义一个静态变量来存储创建好的类实例
•//直接在这里创建类实例,只会创建一次
private static Singleton instance = newSingleton();
•//1:私有化构造方法,便于在内部控制创建实例的数目
privateSingleton(){ }
•//2:定义一个方法来为客户端提供类实例
•//3:这个方法需要定义成类方法,也就是要加static
•//这个方法里面就不需要控制代码了
publicstatic Singleton getInstance(){
•//5:直接使用已经创建好的实例
return instance;
• }
}