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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HPU--spring87 中级黑马   /  2014-7-27 22:06  /  2876 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家对单例模式怎么理解?有点迷糊了。。求指教

9 个回复

倒序浏览
单例就是保持对象的唯一性
回复 使用道具 举报
提菩--空 发表于 2014-7-28 02:54
单例就是保持对象的唯一性

只能实例化一个对象。?
回复 使用道具 举报
对外不能实例化它,但是它的内部提供了一个得到它对象的一个public权限的方法
回复 使用道具 举报
HPU--spring87 发表于 2014-7-28 06:39
只能实例化一个对象。?

嗯,仔细看下毕老师的视频
回复 使用道具 举报
举个最好懂(我认为)的例子来说明一下吧
你想把太阳系的所有星球封装成对象,用这些对象模拟一个太阳系
你能整出两个太阳吗?小心后羿活过来拿箭射你膝盖!
于是你必须保证太阳对象的唯一性。你别说你只new一个出来就好,你不new别人new呢?比如实际开发的时候,你写了一个太阳类,用的时候你自己只new了一个对象,但是一个东西是很多人开发啊,你的队友可能一不小心就new了一堆太阳出来(帝俊、太一高兴了)。

所以,安全的做法是保证这个类有一个对象且只能有一个对象。
当遇到向上面所说的需求时,就会用到单利模式。
如何保证对象的数目不超标呢?私有化构造函数,因为你new对象必须用到构造函数,比如咱们很熟悉的
Person p= new Person();它后面的这个Person()不就是构造函数吗,你把它私有了,你就不能用它了,对象就不能再类的外部创建了,这就保证了数目不超标。
如何保证有一个对象呢?你的对象不能创建了,你也不能一个没有啊,要不这个类就没什么意义了(除非你定义的就是一个工具类,里面全是静态方法)。解决方法是在类中创建一个本类对象。
这样,“某个类的对象有且仅有一个”的要求就满足了了,那么还剩一个问题,我怎么在类的外部获取这个类的对象啊?通过在类中声明一个get方法,一旦调用这个方法,类就返回在类中创建好的单例的本类对象。

回到上面的例子,模拟一个太阳系(所有星体都封装成对象):太阳月亮地球水星啊什么的都得单例,只有一个嘛;但是土星的小行星带中的小行星吗能单例吗,当然不能,因为有很多小行星嘛。

因为不知道楼主你迷糊的是哪里,所以我把我能想到的都说了,包括单例化的过程和我理解的单例的意义(什么时候需要单例),有用没用的请lz捡自己用得到的看吧。

点评

很精辟、透彻,学习了  发表于 2014-7-29 20:37
回复 使用道具 举报 1 0
在程序运行过程中保持只有一个对象
回复 使用道具 举报
毕老师视频讲的很清楚! 重点看视频
回复 使用道具 举报
sugar 中级黑马 2014-7-28 20:37:58
9#
其实就是将构造函数私有化
然后提供一个函数返回该类的实例
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马