4.1 建造者
Builder是一种生成式设计模式,它提供了一种创建复合对象的方法。
将复杂对象的构造与其表示分开,以便相同的构造过程可以产生不同的表示。
优势:
- 允许您更改产品的内部表示;
- 隔离实现构建和展示的代码;
- 更好地控制设计过程。
弱点:
- 创建复杂对象的算法不应取决于对象的组成部分以及它们如何组合在一起;
- 构造过程必须提供被构造对象的不同表示。
一个很好的例子是 HttpRequest 类,它有一个子类 HttpRequest.Builder 可以用来创建 HttpRequest 类的实例并确保它们是有效的。
4.2 惰性初始化
惰性初始化是一种编程技术,在使用其结果之前立即执行某些资源密集型操作(对象创建、值计算)。
因此,初始化是“按需”执行的,而不是提前执行的。类似的想法在各种领域都有应用:例如,即时编译和准时制物流概念。
惰性初始化的一个特例——在访问它时创建一个对象——是生成设计模式之一。它通常与 Factory Method、Loner 和 Proxy 等模式结合使用。
优势:
- 只有在真正需要的时候才进行初始化;
- 应用程序的初始初始化加速:可以推迟的一切都被推迟。
弱点:
- 无法显式设置对象的初始化顺序;
- 第一次访问对象时会有延迟,这在并行执行另一个资源密集型操作时可能很关键。正因为如此,有必要仔细考虑在多线程软件系统中使用惰性初始化的适当性。
还记得在编写 web.xml 时如何指定 servlet 的启动顺序吗?这正是延迟加载的结果。Tomcat 将在第一次访问时创建 servlet 对象。
4.3 对象池
对象池是父设计模式,一组已初始化且随时可用的对象。当系统需要一个对象时,不是创建它,而是从池中取出。当不再需要一个对象时,它不会被销毁而是返回到池中。
当在作业开始时创建对象并在结束时销毁它是昂贵的时,对象池用于提高性能。当频繁创建和销毁对象,但同时存在的对象数量很少时,性能提升尤其明显。
当对象拥有内存以外的资源(例如网络套接字)时,对象池很有用。或者,如果对象集合占用了计算机内存的很大一部分,并且会产生大量“垃圾”。
您还记得,Tomcat 在单独的线程中执行每个请求。但是线程并不是每次都重新创建,而是存储在线程池中。这允许更快地执行请求:当需要一个线程时,它只是从池中取出。顺便提一下,问题是:如何将正在运行的线程放入池中并从池中取出?
GO TO FULL VERSION