黑马程序员技术交流社区
标题: 从老师与学生的关系看单例模式 [打印本页]
作者: 严明 时间: 2012-6-26 20:10
标题: 从老师与学生的关系看单例模式
本帖最后由 严明 于 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的程序员吧?而且模式的学习能帮助你优化代码,锻炼人的思维,学的时并不一定就得有大量的项目经验,当然有的话学起来更快速是不容置疑的!
作者: 韦念欣 时间: 2012-6-26 20:19
严明兄弟说的没错,软件设计确实是很有趣的,这些什么设计模式都不可怕,认真总能学好的。
未雨绸缪才能先人一步,大家一起努力!{:soso_e130:}
作者: 耿鑫 时间: 2012-6-26 20:41
讲的很详细,像那四位大神看齐。
作者: 田建 时间: 2012-6-26 20:57
学习了!
作者: 葛奎 时间: 2012-6-26 20:58
好{:soso_e142:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |