实现并验证单列模式


单列模式(Singleton)也是应用的比较多的一种设计模式,在软件开发中有时候需要对某个类的对象数量加以限制。比如在GUI程序设计中,某个经常用到的窗口只需要一个就够了,没必要每次用到就去创建新的窗口。而如果至创建一个对象将引用随便传来传去又不太方便,这时候采取单列模式就是比较好的解决方案了。

    使用单列模式可以很好的节约资源,尤其是当对象比较大时,对系统开销的节约效果会更加显著。同时由于系统的多个地方共享一个对象,在一定程度上便于控制,

在java中,可以使用以下这种方式使用单例模式创建类的实例:

  public classMyBean {

  private staticMyBean instance = null;

  privateMyBean(){

  //do something

  }

  public staticsynchronized MyBean getInstance(){

  if(instance ==null){

  instance = newMyBean();

  }

  returninstance;

  }

  }

  当一个类的实例可以有且只可以一个的时候就需要用到了。为什么只需要有一个呢?有人说是为了节约内存。本人对这个说法持保留态度。只有一个实例确实减少内存占用,可是我认为这不是使用单例模式的理由。我认为使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?

  Singleton模式主要作用是保证在Java中,一个类Class只有一个实例存在。

  一般Singleton模式通常有两种形式:

  第一种形式: 也是常用的形式。

  public classSingleton {

  private staticSingleton instance = null;

  privateSingleton(){

  //do something

  }

  //这个方法比下面的有所改进,不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率

  public staticSingleton getInstance(){

  if(instance==null){

  instance = newSingleton();

  }

  returninstance;

  }

  }

  第二种形式:

  public classSingleton {

  //在自己内部定义自己的一个实例,只供内部调用

  private staticSingleton instance = new Singleton();

  privateSingleton(){

  //do something

  }

  //这里提供了一个供外部访问本class的静态方法,可以直接访问

  public staticSingleton getInstance(){

  returninstance;

  }

  }


如何验证单例模式

以前说过,一个对象可以生成多个实例,比如每次使用new来生成相同对象的实例,虽然每个实例都是指向同一个对象,但是各个实例之间是独立的,也就是生成了两个对象,这就不是单例模式了;可以通过boolean类型的输出来验证

public class BooleanTest

{

                   publicstatic void main (String [] args)

                   {

                                     Parentparent1 = new Parent ();

                                     Parentparent2 = new Parent ();

                                     System.out.println(parent1 == parent2);

                   }

}

class Parent

{

                   publicvoid method ()

                   {

                                    

                   }

}

输出的结果是false;也就是生成的对象不是同一个对象;

 

使用private关键字和static来生成单例模式

面试的时候,写个单例模式出来;

public class SingletonTest

{                

                   publicstatic void main (String[] args)

                   {                

                   Parentparent1 = Parent.method ();

                   Parentparent2 = Parent.method ();

                   System.out.println(parent1 == parent2);//验证是否为同一个对象

                   }

                  

}

class Parent

{

                   staticParent parent = new Parent ();//知识点;这里将实例定义为static是为了使下面的静态方法可以访问;

                   //静态的方法只能访问静态的变量

                  

                  

                  

                   private  Parent()

                   {

                                    

                   }

                  

                   publicstatic Parent method ( )//定义一个返回类型为Parent的方法,将生成的Parent实例返回给主方法,这样就避免了

                   //在主方法中生成对象;就完成了单例模式;通过验证可以知道二者生成的对象是同一个对象,指向同一个对象;

                   {

                                     returnparent;

                   }

}

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值