| 本帖最后由 严明 于 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的程序员吧?而且模式的学习能帮助你优化代码,锻炼人的思维,学的时并不一定就得有大量的项目经验,当然有的话学起来更快速是不容置疑的! 
 
 
 
 |