HeadFirst设计模式 读书笔记2
来源:互联网 发布:node 执行命令行 编辑:程序博客网 时间:2024/05/29 14:18
烘烤OO的精华
认识工厂方法模式
所有工厂模式都是用来封装对象的创建
工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。
组成元素
创建者Creator类
它定义了一个抽象的工厂方法,让子类实现此方法制造产品。
创建者通常会包含依赖于抽象产品的代码,而这些抽象产品由子类制造。创建者不需要真的知道在制造哪种具体产品。
产品类:工厂生产产品。对PizzaStore来说,产品就是Pizza。
另一个观点:平行的类层级
为什么产品类和创建者类是平行的?都是抽象类,且都有许多具体的子类,每个子类都有自己特定的实现。
NYPizzaStore所封装的是关于如何制作纽约风味的比萨。工厂方法就是封装这种知识的关键所在。
工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
要点:
Creator是一个类,它实现了所有操作产品的方法,但不实现工厂方法。
Creator所有的子类都必须实现这个抽象的factoryMethod方法。
所有的产品必须实现一个共同的接口,这样一来,使用这些产品的类,就可以引用这个接口,而不是具体类。
ConcreteCreator实现了factoryMethod,以实际制造出产品。
ConcreteCreator负责创建一个或多个具体产品,只有ConcreteCreator类知道如何创建这些产品。
设计原则:要依赖抽象,不要依赖具体类。
依赖倒置原则,不能让高层组件依赖低层组件,而且不管高层或低层组件,2者都应该依赖于抽象。
所谓高层组件,是由其他低层组件定义其行为的类。
例如,PizzaStore是个高层组件,因为它的行为是由比萨定义的。
依赖倒置原则,究竟倒置在哪里?
避免OO设计中违反依赖倒置原则
1变量不可以持有具体类的引用。
如果使用new,就会持有具体类的引用。你可以改用工厂来避开这样的做法。
2不要让类派生自具体类。
如果派生自具体类,你就会依赖具体类,请派生自一个抽象(接口或抽象类)
3不要覆盖基类中已实现的方法。
如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被集成的抽象。基类中已实现的方法,应该由所有的子类共享。
抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
比较工厂方法和抽象工厂。。。 要点1:
所有的工厂都是用来封装对象的创建。
简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
工厂方法使用集成:把对象的创建委托给子类,子类实现工厂方法来创建对象。
抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。
所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。
工厂方法允许类将实例化延迟到子类进行。
抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。
依赖倒置原则,知道我们避免依赖具体类型,而要尽量依赖抽象。
工厂是很有为例的技巧,帮助我们针对抽象编程,而不要针对具体类编程。
独一无二的单件模式:用来创建第一无二的,只能有一个实例的对象的入场券。
单件模式
确保一个类只有一个实例,并提供一个全局访问点。
要点
单件模式确保程序中一个类最多只有一个实例。
单件模式也提供访问这个实例的全局点。
在Java中实现单件模式需要私有的构造器,一个静态方法和一个静态变量。
确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程的问题(我们必须认定所有的线程都是多线程的)
如果不是采用第五版的java2,双重检查枷锁实现会失效。
小心,你如果使用多个类加载器,可能导致单件失效而产生多个实例。
如果使用JVM1.2或之前的版本,你必须建立单件注册表,以免垃圾收集器将单件回收。
这些绝密文件的投递箱已经促成了间谍工业的革命。我只要把需求丢进去,就有人会消失,政府一夕之间改朝换代,而我的干洗衣物也好了。我不必管何时何地或者如何完成,反正就是完成了。
在本章,我们把封装带到一个全新的境界:把方法调用封装起来。
加载调用者
客户创建一个命令对象。
客户利用setCommand将命令对象存储在调用者中。
稍后……客户要求调用者执行命令。请注意:一旦命令被加载到调用者,该命令可以被使用并丢弃,或者可以被保留下来并使用许多次。
餐厅应用到命令模式的相应名称
女招待 Invoke
快餐厨师 Receiver
orderUp() execute()
订单 Command
顾客 Client
takeOrder() setCommand()
命令模式
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
命令对象将动作和接收者包进对象中。这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。 NoCommand对象是一个空对象的例子。当你不想返回一个有一一的对象时,空对象就很有用。
客户也可以将处理null的责任转移给空对象。
命令模式的更多用途
队列请求
命令可以将运算快打包(一个接受者和一组动作),然后将它传来传去,就像是一般的对象一样。
日志请求
要点
命令模式将发出请求的对象和执行请求的对象解耦。
在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接受者和一个或一组动作。
调用者通过调用命令对象的execute发出请求,这会使得接收者的动作被调用。
调用者可以接受命令当参数,甚至在运行时动态地进行。
命令可以支持撤销,做法是实现一个undo方法来回到execute被执行前的状态。
宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤销。
实际操作时,很常见使用聪明命令对象,也就是直接实现了请求,而不是将工作委托给接收者。
命令也可以用来实现日志和事务系统。
认识工厂方法模式
所有工厂模式都是用来封装对象的创建
工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。
组成元素
创建者Creator类
它定义了一个抽象的工厂方法,让子类实现此方法制造产品。
创建者通常会包含依赖于抽象产品的代码,而这些抽象产品由子类制造。创建者不需要真的知道在制造哪种具体产品。
产品类:工厂生产产品。对PizzaStore来说,产品就是Pizza。
另一个观点:平行的类层级
为什么产品类和创建者类是平行的?都是抽象类,且都有许多具体的子类,每个子类都有自己特定的实现。
NYPizzaStore所封装的是关于如何制作纽约风味的比萨。工厂方法就是封装这种知识的关键所在。
工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
要点:
Creator是一个类,它实现了所有操作产品的方法,但不实现工厂方法。
Creator所有的子类都必须实现这个抽象的factoryMethod方法。
所有的产品必须实现一个共同的接口,这样一来,使用这些产品的类,就可以引用这个接口,而不是具体类。
ConcreteCreator实现了factoryMethod,以实际制造出产品。
ConcreteCreator负责创建一个或多个具体产品,只有ConcreteCreator类知道如何创建这些产品。
设计原则:要依赖抽象,不要依赖具体类。
依赖倒置原则,不能让高层组件依赖低层组件,而且不管高层或低层组件,2者都应该依赖于抽象。
所谓高层组件,是由其他低层组件定义其行为的类。
例如,PizzaStore是个高层组件,因为它的行为是由比萨定义的。
依赖倒置原则,究竟倒置在哪里?
避免OO设计中违反依赖倒置原则
1变量不可以持有具体类的引用。
如果使用new,就会持有具体类的引用。你可以改用工厂来避开这样的做法。
2不要让类派生自具体类。
如果派生自具体类,你就会依赖具体类,请派生自一个抽象(接口或抽象类)
3不要覆盖基类中已实现的方法。
如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被集成的抽象。基类中已实现的方法,应该由所有的子类共享。
抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
比较工厂方法和抽象工厂。。。 要点1:
所有的工厂都是用来封装对象的创建。
简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
工厂方法使用集成:把对象的创建委托给子类,子类实现工厂方法来创建对象。
抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。
所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。
工厂方法允许类将实例化延迟到子类进行。
抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。
依赖倒置原则,知道我们避免依赖具体类型,而要尽量依赖抽象。
工厂是很有为例的技巧,帮助我们针对抽象编程,而不要针对具体类编程。
独一无二的单件模式:用来创建第一无二的,只能有一个实例的对象的入场券。
单件模式
确保一个类只有一个实例,并提供一个全局访问点。
要点
单件模式确保程序中一个类最多只有一个实例。
单件模式也提供访问这个实例的全局点。
在Java中实现单件模式需要私有的构造器,一个静态方法和一个静态变量。
确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程的问题(我们必须认定所有的线程都是多线程的)
如果不是采用第五版的java2,双重检查枷锁实现会失效。
小心,你如果使用多个类加载器,可能导致单件失效而产生多个实例。
如果使用JVM1.2或之前的版本,你必须建立单件注册表,以免垃圾收集器将单件回收。
这些绝密文件的投递箱已经促成了间谍工业的革命。我只要把需求丢进去,就有人会消失,政府一夕之间改朝换代,而我的干洗衣物也好了。我不必管何时何地或者如何完成,反正就是完成了。
在本章,我们把封装带到一个全新的境界:把方法调用封装起来。
加载调用者
客户创建一个命令对象。
客户利用setCommand将命令对象存储在调用者中。
稍后……客户要求调用者执行命令。请注意:一旦命令被加载到调用者,该命令可以被使用并丢弃,或者可以被保留下来并使用许多次。
餐厅应用到命令模式的相应名称
女招待 Invoke
快餐厨师 Receiver
orderUp() execute()
订单 Command
顾客 Client
takeOrder() setCommand()
命令模式
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
命令对象将动作和接收者包进对象中。这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。 NoCommand对象是一个空对象的例子。当你不想返回一个有一一的对象时,空对象就很有用。
客户也可以将处理null的责任转移给空对象。
命令模式的更多用途
队列请求
命令可以将运算快打包(一个接受者和一组动作),然后将它传来传去,就像是一般的对象一样。
日志请求
要点
命令模式将发出请求的对象和执行请求的对象解耦。
在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接受者和一个或一组动作。
调用者通过调用命令对象的execute发出请求,这会使得接收者的动作被调用。
调用者可以接受命令当参数,甚至在运行时动态地进行。
命令可以支持撤销,做法是实现一个undo方法来回到execute被执行前的状态。
宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤销。
实际操作时,很常见使用聪明命令对象,也就是直接实现了请求,而不是将工作委托给接收者。
命令也可以用来实现日志和事务系统。
- HeadFirst设计模式 读书笔记2
- HeadFirst设计模式 读书笔记
- HeadFirst设计模式 读书笔记
- 读书笔记:《HeadFirst设计模式》
- HeadFirst设计模式读书笔记
- HeadFirst设计模式 读书笔记1
- HeadFirst设计模式 读书笔记3
- HeadFirst设计模式 读书笔记4
- HeadFirst设计模式 读书笔记5
- HeadFirst设计模式读书笔记--观察者模式(2)(二)
- 《HeadFirst设计模式》读书笔记-第2章-观察者模式
- HeadFirst设计模式读书笔记(一)
- 【读书笔记】HeadFirst设计模式——工厂模式简述
- 【读书笔记】HeadFirst设计模式——命令模式简述
- HeadFirst设计模式读书笔记--观察者模式(1)(二)
- HeadFirst设计模式读书笔记--观察者模式(3)(二)
- HeadFirst设计模式读书笔记--装饰者模式(三)
- 读书笔记 HeadFirst设计模式之装饰器(Decorator)模式
- 台湾民间捐24亿 爱心赢大陆富豪
- 在母版里使用FindControl(转)
- 设计模式学习--工厂方法模式
- 曾仕强老师视频
- Java Swing 界面统一设置字体格式
- HeadFirst设计模式 读书笔记2
- The Portable Executable File Format from Top to Bottom
- 使用API判断网络是否连通(InternetGetConnectedState / IsNetworkAlive)
- MFC程序逆向 – 消息篇(上)
- C语言头文件引入
- oracle 如何获取表的主键列名,如何获取表的所有列名
- MFC程序逆向 – 消息篇(下)
- 完全用GNU/Linux工作
- 点击输入框显示一个时间选择界面