A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严明 初级黑马   /  2012-6-26 20:10  /  2517 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 严明 于 2012-6-27 15:28 编辑



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

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

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

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


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

package com.demo.Singleton;

public class Teacher
{
private static final Teacher teacher= new Teacher();


/*"我"不希望产生第二个老师,则定义成private,避免被其他类new出来一个对象,
* 但是只有我自己可以new出一个对象,
*/

private Teacher(){

}

   public static TeachergetTeacher(){//对外提供一个方法获得Teacher的对象中,但是只能是同一个对象.
      return teacher;
   }
   public static void say(){ //"我"还有其他的行为,最好定义成static
      System.out.println("你们每天都要大声的叫'老师好!'");
   }

}


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


package com.demo.Singleton;
public class Student //学生类,不同的学生面对的是同一个老师
{
   public static void main(String[] args)//学生每天都要对着同一个老师喊"老师好!",怎么实现?
   {

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

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

   }

}



这个模式有什么用呢?
当实例存在多个会引起程序逻辑错误的时,比如杀毒软件都在用吧,那里面的序列号是唯一的, 像这种要求生成唯一的序列号的环境,不许一个应用上存在多个
整个项目中需要一个共享访问点 或者共享数据时
需用定义大量的静态常量 静态的方法时,比如工具类的产生.


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

public class Teacher
{

private static final Teacher teacher= null;
private Teacher(){

}

   public static TeachergetTeacher(){

If(teacher== null){//这是一定成立的
teacher =  new Teacher();
}

      return teacher;
   }
   public static void say(){
      System.out.println("你们每天都要大声的叫'老师好!'");
   }

}





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

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




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




评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 最后一句不错!

查看全部评分

4 个回复

倒序浏览
严明兄弟说的没错,软件设计确实是很有趣的,这些什么设计模式都不可怕,认真总能学好的。
未雨绸缪才能先人一步,大家一起努力!{:soso_e130:}
回复 使用道具 举报
讲的很详细,像那四位大神看齐。
回复 使用道具 举报
学习了!
回复 使用道具 举报

回帖奖励 +1

好{:soso_e142:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马