举个最好懂(我认为)的例子来说明一下吧
你想把太阳系的所有星球封装成对象,用这些对象模拟一个太阳系
你能整出两个太阳吗?小心后羿活过来拿箭射你膝盖!
于是你必须保证太阳对象的唯一性。你别说你只new一个出来就好,你不new别人new呢?比如实际开发的时候,你写了一个太阳类,用的时候你自己只new了一个对象,但是一个东西是很多人开发啊,你的队友可能一不小心就new了一堆太阳出来(帝俊、太一高兴了)。
所以,安全的做法是保证这个类有一个对象且只能有一个对象。
当遇到向上面所说的需求时,就会用到单利模式。
如何保证对象的数目不超标呢?私有化构造函数,因为你new对象必须用到构造函数,比如咱们很熟悉的
Person p= new Person();它后面的这个Person()不就是构造函数吗,你把它私有了,你就不能用它了,对象就不能再类的外部创建了,这就保证了数目不超标。
如何保证有一个对象呢?你的对象不能创建了,你也不能一个没有啊,要不这个类就没什么意义了(除非你定义的就是一个工具类,里面全是静态方法)。解决方法是在类中创建一个本类对象。
这样,“某个类的对象有且仅有一个”的要求就满足了了,那么还剩一个问题,我怎么在类的外部获取这个类的对象啊?通过在类中声明一个get方法,一旦调用这个方法,类就返回在类中创建好的单例的本类对象。
回到上面的例子,模拟一个太阳系(所有星体都封装成对象):太阳月亮地球水星啊什么的都得单例,只有一个嘛;但是土星的小行星带中的小行星吗能单例吗,当然不能,因为有很多小行星嘛。
因为不知道楼主你迷糊的是哪里,所以我把我能想到的都说了,包括单例化的过程和我理解的单例的意义(什么时候需要单例),有用没用的请lz捡自己用得到的看吧。 |