30.}
通过单例模式的学习告诉我们:
1、单例模式理解起来简单,但是具体实现起来还是有一定的难度。
2、synchronized 关键字锁定的是对象,在用的时候,一定要在恰当的地方使用(注意需要使
用锁的对象和过程,可能有的时候并不是整个对象及整个过程都需要锁)。
到这儿,单例模式基本已经讲完了,结尾处,笔者突然想到另一个问题,就是采用类的静态方
法,实现单例模式的效果,也是可行的,此处二者有什么不同?
首先,静态类不能实现接口。(从类的角度说是可以的,但是那样就破坏了静态了。因为接口
中不允许有 static 修饰的方法,所以即使实现了也是非静态的)
其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化。之所以延迟加载,是因为
有些类比较庞大,所以延迟加载有助于提升性能。
再次,单例类可以被继承,他的方法可以被覆写。但是静态类内部方法都是 static,无法被覆
写。
最后一点,单例类比较灵活,毕竟从实现上只是一个普通的 Java 类,只要满足单例的基本需求,
你可以在里面随心所欲的实现一些其它功能,但是静态类不行。从上面这些概括中,基本可以
看出二者的区别,但是,从另一方面讲,我们上面最后实现的那个单例模式,内部就是用一个
静态类来实现的,所以,二者有很大的关联,只是我们考虑问题的层面不同罢了。两种思想的
结合,才能造就出完美的解决方案,就像 HashMap 采用数组+链表来实现一样,其实生活中很
多事情都是这样,单用不同的方法来处理问题,总是有优点也有缺点,最完美的方法是,结合
各个方法的优点,才能最好的解决问题!
4、建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用
来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象
工厂模式和最后的 Test 结合起来得到的。我们看一下代码:
还和前面一样,一个 Sender 接口,两个实现类 MailSender 和 SmsSender。最后,建造者
类如下:
1.public class Builder {
2.
3. private List<Sender> list = new ArrayList<Sender>();
4.
5. public void produceMailSender(int count){
6. for(int i=0; i<count; i++){
7. list.add(new MailSender());
8. }
9. }
10.
11. public void produceSmsSender(int count){
12. for(int i=0; i<count; i++){
13. list.add(new SmsSender());