您的位置:首页 > 编程语言 > Java开发

java设计模式之单例模式Singleton

2012-09-15 10:21 302 查看
1、 意图

保证一个类仅有一个实例,并提供一个反问它的全局访问点。

2、 适用性

在下面情况下可以使用Singleton模式
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

3、 结构






4、 参与者

Singleton —— 定义一个instance操作,允许客户访问它的唯一实例。Instance是一个静态方法。——可能负责创建它自己的唯一实例。

5、 协作

客户只能通过Singleton的instance方法访问一个Singleton的实例。

6、 效果

Singleton模式有许多优点:

1)  对唯一实例的受控访问。因为Singleton类封装它的唯一实例,所以它可以严格控制的客户怎样以及何时访问它。

2)  缩小命名空间。Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染命名空间。

3)  允许可变数目的实例。这个模式使得你易于改变你的想法,并允许Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的实例的数目。只允许访问Singleton实例的操作需要改变。

4)  比类操作更灵活。另一种封装单例功能的方式是使用类操作。

7、 实现

下面是使用Singleton模式时所以考虑的实现问题:

1)  保证一个唯一的实例。Singleton模式使得这个唯一实例是类的一般实例,但该类被写成只有一个实例能被创建。做到这一点的一个常用方法是将创建这个实例的操作隐藏在一个类操作后面,由它保证只有一个实例被创建。

2)  创建Singleton类的子类。主要问题与其说是定义子类不如说是建立它的唯一实例,这样客户就可以使用它。事实上,指向单件实例的变量必须用子类的实例进行初始化。

8、 代码示例

Singleton

[java] view
plaincopy

package com.examples.pattern.singleton;  

  

publicclass Singleton {  

     

    privatestatic Singleton sing;  

     

    private Singleton(){  

        

    }  

    

    publicstatic Singleton getInstance(){  

        

       if(sing == null){  

           sing = new Singleton();  

       }  

       returnsing;  

    }  

}  

Client

[java] view
plaincopy

package com.examples.pattern.singleton;  

  

publicclass Client {  

  

    publicstaticvoid main(String[] args) {  

  

       Singleton sing = Singleton.getInstance();  

       Singleton sing2 = Singleton.getInstance();  

  

       System.out.println(sing);  

       System.out.println(sing2);  

  

    }  

  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息