设计模式常见问题

学习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

posted on 2018-03-30 08:33  时间朋友  阅读(774)  评论(0编辑  收藏  举报

导航