设计模式常见问题
学习Java 设计模式推荐看https://github.com/iluwatar/java-design-patterns,里面不仅限于GoF的23中设计模式,大部分模式都有意图、案例、代码说明。下面是借助工具翻译的里面FAQ内容。
问:状态和策略模式有什么区别?{ # Q1 }
虽然实现是相似的,但它们解决了不同的问题。状态模式处理对象处于什么状态——它封装了与状态相关的行为。策略模式处理对象如何执行特定任务——它封装了一个算法。
问:策略模式和模板方法模式有什么区别?{ # Q2 }
在模板法中,算法是在编译时通过继承选择的。策略模式是在运行时通过组合选择算法。
问:代理和装饰模式有什么区别?{ # Q3 }
区别在于模式的意图。代理模式控制直接访问对象,装饰器模式用于向对象添加职责。
问:责任链和拦截过滤器模式有什么区别?{ # Q4 }
虽然实现看起来相似,但存在差异。责任链形成了一个请求处理器链,然后处理器一个接一个地执行,直到找到正确的处理器。在拦截器链一般每个拦截器都会执行。
问:访问者和双调度模式之间的区别是什么?{ # Q5 }
访问者模式是向现有类添加新操作的一种手段。双调度是调度两个多态类型的函数的一种手段,而不是一个单一的多态类型。
问:享元模式和对象池模式之间的差异是什么?{ # Q6 }
它们在使用方式上有所不同。
调用者必须从池中获取对象后使用,使用完后将对象返回到对象池中。相同的对象可以存在多个实例,对象池一般会有最大容量限制。
享元模式的对象是单例,也可以由多个线程同时使用。
对于并发访问,对象池模式通常不需要线程安全,因为只有一个线程同时使用特定对象实例。而享元模式的对象实例必须是不变的(最好的选择),或要实现线程安全。
至于性能和可伸缩性,对象池可能会成为瓶颈,如果对象池中所有的对象都被使用,那么新的线程将被阻塞,等待池中可用的对象。而享元模式不存在这种情况。
问:流接口和建造者模式之间的差异是什么?{ # Q7 }
流接口有时与建造者模式混淆,然而,流接口主要是用来创建共享(易变的)对象,配置复杂的对象而不必重新指定目标对象的每一属性的改变。
问:java.io.serialization和Memento模式之间的区别是什么?{ # Q8 }
Memento通常用于实现回滚/保存点支持。例如,我们可能希望在一个时间点标记一个对象的状态,做一些工作,然后决定回滚到以前的状态。
序列化可以用作一种工具,将对象的状态保存到字节流并保存到内存或磁盘中。当调用反序列化方法时可以将该对象信息还原成以前的状态。
Memento是一种模式,序列化是一种可以用于实现此模式的工具。实现该模式的其他方法可以是克隆对象。
英文原文:https://github.com/iluwatar/java-design-patterns/blob/master/faq.md