实现并验证单列模式

来源:互联网 发布:java年终总结 编辑:程序博客网 时间:2024/06/08 00:04


单列模式(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;

                   }

}

 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 收到捷信催收律师函怎么办 快钱贷款不还怎么办 快易花逾期3个月怎么办 欠微粒贷一万多没还找上门了怎么办 装修公司骚扰电话太多了怎么办 总有大便的感觉怎么办 黎明杀机无网络连接怎么办 监控视频电脑播放不了怎么办 绝地手游击倒了怎么办? 绝地求生全军出击倒地后怎么办 黑魂3杀了npc怎么办 菜刀背容易割手怎么办 商铺厨房太热怎么办 农村自建房厨房卫生间怎么办 宾利车门不会开怎么办 两岁的宝宝好动怎么办 被别人坏了名声怎么办 在单位混臭了怎么办 在公司名声臭了怎么办 怀孕三个月吐的厉害怎么办 孕38周轻微贫血怎么办 孕38周中度贫血怎么办 孕38周贫血严重怎么办 孕38周有点贫血怎么办 脚被热水烫红了怎么办 学员练车撞死人怎么办 三胎意外来了该怎么办 因为飞机延误耽误行程怎么办 伤了朋友的心怎么办 羊蹄被绳子缠肿了怎么办 新老师教的不好怎么办 跟老公三观不合怎么办 突然有社保补扣怎么办 街头篮球篮板反应慢怎么办 换水了龙鱼顶缸怎么办 压着眼睛睡觉醒来模糊怎么办 天热眼睛有眼屎怎么办 眼睛里膜起来了怎么办 眼睛一边大一边小怎么办 眼白膜鼓起来了怎么办 主持问答环节没人提问怎么办