楼主: 臧圩人

《Head First设计模式》阅读笔记.全书总结

[复制链接]
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
11#
 楼主| 发表于 2010-4-14 15:24 | 只看该作者
*工厂方法模式可以和策略(Strategy)模式结合起来,在运行时动态地更换工厂类,从而创建不同的产品对象,这是简单工厂所不具有的弹性。

*依赖倒置原则说明不能让高层组件依赖于底层组件,而是它们都应该依赖于抽象。

*抽象工厂模式是工厂方法模式的演变。工厂方法模式中,创建者只生产一种类型的产品,而抽象工厂模式中,创建者生产一组不同类型的产品。

*所有工厂模式都通过减少应用程序和具体类之间的依赖来促进松耦合,即解耦(Decouple)。

*有些对象我们只需要一个,比如说:线程池(threadpool)、缓存(cache)、对话框(Dialog)、处理偏好设置的对象、处理注册表(register)的对象、日志对象,以及充当打印机、显卡等设备的驱动程序对象。这些对象只能有一个实例,如果出现多个实例就会导致程序的行为异常、资源使用过量,或者产生的结果不一致等等问题。

*单件模式与全局静态变量的区别:
(1)使用全局静态变量需要程序员之间的约定才能保证只有一个实例,而单件模式无需这样的约定就可以确保只有一个实例被创建。
(2)静态变量在程序一开始就被创建(这取决于JVM的实现),而单件模式只是在使用时才创建对象。如果这个被创建的对象非常消耗资源,而在程序运行的过程中没有用到它,就会造成很大的浪费,这是静态变量的缺点。

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
12#
 楼主| 发表于 2010-4-14 15:24 | 只看该作者
*在单态模式中,如果不需要这个实例,它就永远不会被创建。这就是“延迟实例化(Lazy Instance)”。

*单件常用来管理共享的资源,比如数据库连接池或线程池。

*多线程会影响到单件模式,如果不对它进行处理就会在单件模式下仍然创建多于一个实例。

在这个方法里使用到了volatile这个关键字,下面对这个“关键的”关键字进行说明:
Java语言规范指出,为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入和离开同步代码块时才与共享成员变量的原始值进行对比。
而被volatile修饰的成员变量在线程中的私有拷贝每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量的私有拷贝发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
因此volatile关键字是使“双重检查加锁(Double-Checked Locking)”有效的前提。
但是需要注意,在1.4及以前版本的JDK中,JVM对volatile关键字的实现会导致双重检查加锁失效,所以这个方法只适用于1.5(包含)以后版本。

*可以通过把一个类中的全部方法都定义为静态方法的方式来达到和单件模式同样的效果,但是由于类的初始化顺序由JVM控制,所以可能导致与初始化顺序有关的BUG,而这样的BUG常常难于被发现。当类的初始化比较简单时,可以使用此方法。

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
13#
 楼主| 发表于 2010-4-14 15:24 | 只看该作者
*类加载器会破坏单件模式,因为不同的类加载器可以分别创建同一个单件的对象,单件对象就有了多个实例。解决办法是:自行指定类加载器,并且指定同一个类加载器。

*在Java 1.2及以前版本中,垃圾收集器有一个BUG,会造成单件在没有全局引用时,被当做垃圾清理掉。在1.2以后的版本中,这个BUG已经得到了修复,因此不用担心了。
如果使用的是1.2及以前的版本,可以建立一个单件注册表(Register),从而避免单件被垃圾收集器回收。

*命令(Command)模式通过把接受者当作参数来传递,并且让所有的命令对象都实现一个命令接口的方式,实现了针对接口编程,从而在调用者和接受者之间实现了解耦。

*适配器(Adapter)模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者;这种做法还有额外的优点,那就是被适配者的任何子类都可以搭配着适配器使用。

*外观模式在简化接口的同时,依然将系统完整的功能暴露出来,一共需要的人使用。

*外观模式不仅简化了接口,也将客户从组件的子系统中解耦。

*适配器(Adapter)模式和外观(Facade)模式都可以包装多个类,前者的目的是将接口重新组织后提供新接口,后者的目的是简化接口。由于它们的差异很细微,所以两者常常同时出现。

*适配器(Adapter)将一个对象包装起来以改变其接口;装饰者(Decorator)将一个对象包装起来以增加新的行为和责任;而外观(Facade)将一群对象包装起来以简化其接口。

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
14#
 楼主| 发表于 2010-4-14 15:24 | 只看该作者
*当我们说“集合(Collection)”的时候,我们指的是一群对象。其存储方式可以是各式各样的数据结构,例如:列表、数组、散列表,无论用什么方式存储,一律可以视为集合。有时候也被称为聚合(aggregate)。

*迭代器(Iterator)模式把元素之间游走的任务交给了迭代器,而不是聚合对象。这不仅让聚合的接口和实现变得更简洁,也让它专注于管理对象,而不必理会遍历的事情。

*类的每个责任都有一个潜在的改变区域,多一个责任就意味着多一个改变的区域。要尽量让每个类保持单一责任。

*既要让每个类都保持单一的责任,也要保证一个责任只指派给一个类。

*内聚(Cohesion)用来度量一个类或模块紧密地达到单一目的或责任的程度。

*当一个类或模块被设计成只支持一组相关功能时,我们说它具有高内聚;反之,当被设计成支持一组不相关的功能时,我们说它具有低内聚。

*“空对象设计模式”带来的好处是客户不用处理null,因此不必担心系统会跑出NullPointerException。

*当多个对象彼此之间有“整体/部分”的关系,并且你想用一致的方式处理这些对象时(就是让它们看起来一样,有共同的方法可以调用),就需要用组合(Composite)模式。

*在组合中加入缓存可以提高遍历的性能。

*模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
15#
 楼主| 发表于 2010-4-14 15:25 | 只看该作者
*好莱坞原则可以尽量减少类之间的过分依赖,防止“依赖腐.败”。

*策略(Strategy)模式与模板方法(Template Method)模式的区别:策略模式实现了完整的算法,各个算法之间可以互相替换;而模板方法只定义了算法的骨架,其中一部分步骤需要子类来实现。

*使用状态模式通常会导致设计中类的数目大量增加。

*状态可以被多个Context实例共享。

*远程代理(Remote Proxy)模式:可以作为另一个JVM上对象的本地代表。调用代理的方法会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。

*虚拟代理(Virtual Proxy)模式:作为创建开销大的对象的代表。虚拟代理经常在我们真正需要一个对象的时候才创建它。当对象在创建前和创建中时,由代理来扮演它的替身。对象创建后,代理就会将请求直接委托给对象。

*动态代理:Java在java.lang.reflect包中有自己的代理支持。利用这个包你可以在运行时动态地创建代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类。因为实际的代理类是在运行时创建的,因此称这项Java技术为动态代理。

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
16#
 楼主| 发表于 2010-4-14 15:25 | 只看该作者
其他种类的代理:
一、防火墙代理(Firewall Proxy):控制网络资源的访问,保护资源免受“坏客户”的侵害。
二、智能引用代理(Smart Reference Proxy):当主题被引用时,进行额外的动作,例如计算一个对象被引用的次数。
三、缓存代理(Caching Proxy):为开销大的计算结果提供暂时存储。它允许多个客户共享结果以减少计算或网络延迟。
四、同步代理(Synchronization Proxy):在多线程的情况下为主题提供安全的访问。
五、复杂隐藏代理(Complexity Hiding Proxy):用来隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也成为外观代理(Facade Proxy)。复杂隐藏代理和外观模式是不一样的,因为代理控制访问,而外观模式只提供另一组接口。
六、写入时复制代理(Copy-On-Write Proxy):用来控制对象的复制,方法是延迟对象的复制,直到客户真的需要为止,这是虚拟代理的变体。

模式的分类:
创建型:工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单态/单件(Singleton)。
行为型:状态(State)、策略(Strategy)、观察者(Observer)、模板方法(Template Method)、命令(Command)、迭代器(Iterator)。
结构型:装饰者(Decorator)、外观(Facade)、代理(Proxy)、适配器(Adapter)、组合(Composite)。

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
17#
 楼主| 发表于 2010-4-14 15:25 | 只看该作者
*设计的原则是用最简单的方式解决问题,而不是一定要用设计模式。

共享词汇的五种方式:
一、在设计会议中。可以便面陷入实现的细节和引起误解。
二、和其他开发人员。分享知识。
三、在架构文档中。可以缩减文档的篇幅,并使阅读者更清晰地理解设计。
四、在代码注释及命名习惯上。提高代码的可读性。
五、将志同道合的开发人员集合在一起。

*为实际的扩展使用模式,不要为了假想的需要而使用模式。

*简单才是王道。最好的设计是不使用设计模式就能设计出最简单的方案。

*模式是工具而不是规则,需要被简单地调整以符合你的需要。

*像模式一样,有许多类型的反模式。包括开发反模式,OO反模式,组织反模式和领域特定反模式。

*反模式告诉你为何这个解决方案从长远来看会造成不好的影响。

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
18#
 楼主| 发表于 2010-4-14 15:25 | 只看该作者
5、其他模式及其优缺点。

请见附录部分笔记。

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
19#
 楼主| 发表于 2010-4-14 15:26 | 只看该作者
全书OVER!

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
20#
发表于 2010-4-14 23:11 | 只看该作者
nice job

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表