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