黑马程序员_单例模式

来源:互联网 发布:centos 安装bugzilla 编辑:程序博客网 时间:2024/05/19 23:25

------------------------------android培训java培训期待与您交流! ----------------------------------------------------------------

从老师与学生的关系看单例模式

 

设计来源生活,在软件设计时更是离不开生活,今天给大家用生活中最平常的小例子来介绍一下23种设计模式中最简单的一种: 单例模式.

 

单例模式顾名思义就是只有一个实例

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类.

 

反映到生活中,有 1 个班级只有1 个老师, 好多好多学生, 一对多的关系. 老师说你们得听我的,我就是独裁者! 呵呵 ,当然不会应许产生两个老师了.

 

//来个老师, 不是抽象 也不是接口而是唯一的

package com.demo.Singleton;

 

publicclass Teacher

{

  

privatestaticfinal Teacherteacher=newTeacher();

 

/*""不希望产生第二个老师,则定义成private,避免被其他类new出来一个对象,

 * 但是只有我自己可以new出一个对象,

 */

privateTeacher(){

  

}

 

   publicstatic Teacher getTeacher(){//对外提供一个方法获得Teacher的对象中,但是只能是同一个对象.

      returnteacher;

   }

   publicstaticvoid say(){//""还有其他的行为,最好定义成static

      System.out.println("你们每天都要大声的叫'老师好!'");

   }

 

}

 

有了老师,当然少不了学生:

 

package com.demo.Singleton;

 

publicclass Student//学生类,不同的学生面对的是同一个老师

{

   publicstaticvoid main(String[] args)

   {//学生每天都要对着同一个老师喊"老师好!",怎么实现?

 

      for (int day = 0; day < 1000; day++)

      {

 

         Teacher teacher = Teacher.getTeacher();//每天看到的都是同一个老师,这就是单例

         teacher.say();

      }

 

   }

 

}

 

 

 

这个模式有什么用呢?

当实例存在多个会引起程序逻辑错误的时,比如杀毒软件都在用吧,那里面的序列号是唯一的, 像这种要求生成唯一的序列号的环境,不许一个应用上存在多个

整个项目中需要一个共享访问点 或者共享数据时

需用定义大量的静态常量 静态的方法时,比如工具类的产生.

 

 

单例模式其实还有一种形式,俗称懒汉式, 那么上述的代码就是饿汉式

将Teacher改写一下:

 

publicclass Teacher

{

  

privatestaticfinal Teacherteacher=null;

private Teacher(){

  

}

 

   publicstatic Teacher getTeacher(){

 

If(teacher == null){//这是一定成立的

 teacher =  new Teacher();

}

 

      returnteacher;

   }

   publicstaticvoid say(){

      System.out.println("你们每天都要大声的叫'老师好!'");

   }

 

}

这个单例是线程不安全的,试想:一个人  十个人访问没问题,但是一千一万个人同时访问,并发量就增加了, 一个线程A执行到teacher = new Teacher(); 但是还没有获取对象,对象的初始化需用时间,这时线程B执行到(teacher == null)判断,为真,继续运行,那么线程B都会获得一个对象, 内存中同时出现了两个对象了.

 

怎么解决呢? getTeacher()方法之前或者里面增加synchronized关键字来实现,但不建议这样使用.

 

 

 

 

其实软件设计很有趣的,对吧! 愿大家多多观察, 做个生活的有心人,那些看似高深的东西没那么可怕,不过如此,有人认为现在Java基础阶段不宜接触 也不需用学习模式,留给以后有了项目经验再来学模式,其实这种想法是不正确的,未雨绸缪才能先人一步,总不会觉得自己一辈子都能当个哭bi的程序员吧?而且模式的学习能帮助你优化代码,锻炼人的思维,学的时并不一定就得有大量的项目经验,当然有的话学起来更快速是不容置疑的!

 

 

 


-----------------------------android培训java培训期待与您交流!----详细请查看:http://edu.csdn.net/heima---------------



原创粉丝点击