Singleton

 
   深入浅出的讲述了设计模式中的 单例模式,并给出了简单的示例,例子浅显易懂,并附带源代码。
       单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说,只有一个实例是很重要的,虽然系统中可以有许多打印机,但却只应该有一个打印机假脱机,只应该有一个文件系统和一个窗口管理器,一个数字滤波器只能有一个A/D转换器,一个会计系统只能专用于一个公司。怎样才能保证一个类只有一个实例并且这个实例易于被访问,一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象,一个更好的方法是让类自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法,这就是Singleton模式。
       实用性:在下面的情况下可以使用Singleton模式。
l          当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
l          当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
例如:一个产生随机数的例子,整个应用程序中只需要一个类的实例来产生随机数,客户端程序从类中获取这个实例,调用这个实例的方法nextInt(),公用的方法访问需要进行同步,这是单例模式需要解决的同步问题。
 
参与者:Singleton:定义一个Instance操作,允许客户访问它的唯一实例,Instance是一个类操作。可能负责创建自己的唯一实例。
协作关系:客户只能通过Singleton的Instance操作访问一个Singleton的实例。
使用Singleton模式有许多优点:
1.        对唯一实例的受控访问,
2.        缩小命名空间,
3.        允许对操作和表示的精化,
4.        允许可变数目的实例。
5.        比类操作更灵活。
代码:
       单例模式中需要解决的重要问题是方法的同步问题,同步的粒度有多大等。在本例子中同在获得类的实例的时候使用了同步,代码如下:
public class Singleton{
  private Singleton(){
    generator = new Random();
  }
  public  void setSeed(int seed){
    generator.setSeed(seed);
  }
  public  int nextInt(){
    returngenerator.nextInt();
  }
  public  static  synchronized Singleton getInstance(){
    if (instance ==null) {
      instance =new Singleton();
    }
    returninstance;
  }
  private Randomgenerator;
  private  static Singletoninstance;
}
客户端调用的代码:
package singleton;
public  class Client{
    public  static  void main(String[] args){
       Singleton s1 = Singleton.getInstance();
       System.out.println(s1.toString());
       for(int i=0;i<10;i++){
           Singleton s2 = Singleton.getInstance();
           System.out.println("The randomed number is "+s2.toString());
       }
    }
}
总结:单例模式使得应用程序在运行时保持只能有一个实例,在一些大的应用程序中,主程序只需要有一个,因此需要使用单例模式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单例模式Singleton Pattern)是一种创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。单例模式通常用于控制某些资源的访问权限,或者在整个系统需要一个共享资源的情况下使用。 在单例模式,类的构造函数必须私有化,这样外部就不能直接实例化该类。同时,类需要定义一个静态方法,用于获取该类唯一的实例。在第一次调用该方法时,会创建一个实例,并将其保存下来。以后每次调用该方法时,都会返回同一个实例。 例如,下面的代码演示了如何在C++实现单例模式: ```c++ class Singleton { public: static Singleton& getInstance() { static Singleton instance; // 延迟初始化,保证线程安全 return instance; } private: Singleton() {} // 将构造函数私有化,防止外部实例化 Singleton(const Singleton&) = delete; // 禁止拷贝构造函数 Singleton& operator=(const Singleton&) = delete; // 禁止赋值运算符 }; int main() { Singleton& s1 = Singleton::getInstance(); Singleton& s2 = Singleton::getInstance(); std::cout << std::boolalpha << (&s1 == &s2) << std::endl; // 输出:true return 0; } ``` 在这个例子,我们定义了一个名为Singleton的类,并将其构造函数私有化,防止外部实例化。同时,我们定义了一个静态方法getInstance,用于获取该类唯一的实例。在getInstance方法,我们使用了静态局部变量的方式来延迟初始化,保证线程安全。最后,在main函数,我们多次调用getInstance方法,每次调用都会返回同一个实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值