备忘录模式

备忘录模式就是创建了一个新的类,这个类的成员和原发器成员高度重复,也就是需要做回滚操作的成员都需要在备忘录这个类中复写一份;备忘录类的这些成员都是private的,这样的话外部就无法修改这些成员。客户端代码先调用原发器的创建备忘录方法返回一个备忘录,自己保存起来,当需要做状态恢复的时候,调用原发器的restore方法,传入之前保存的备忘录实例即可。这样对核心状态就做到了封装。

(问题1:新增一个状态的话,需要同时修改原发器和snapshot两个类)

(其实这里的一个核心的封装思路就是:原发器的状态修改只有原发器自己有权限,外部不能独立修改其状态,只有通过调用restore方法传入预期应该修改成的样子)

(问题2:客户端代码仍然可以自己创建一个snapshot实例,然后把这个实例传入原发器的restore方法进行状态设置)

《深入设计模式》一书中的伪代码思路:

创建一个快照类,这个类持有原发器的引用,快照类负责restore,原发器负责createSnapshot,返回一个snapShot实例,这个实例实际又持有原发器的引用,因此原发器应该是返回了自己的一个包装(利用snapshot这张皮把自己包起来)(这个其实是《深入设计模式》一书中的伪代码实现方式,这个方式有一个缺点就是当restore状态时,snapshot类需要调用原发器提供的set方法,相当于强制要求原发器提供了set方法,破坏了原发器的封装,上面的一段描述才是正确的实现)

工厂方法模式

一个产品要对应的写一个工厂类

工厂方法适用的场景

  • 当你编写代码的过程中,无法预知对象确切类别及其依赖关系时,可使用工厂方法
    • 工厂方法将创建产品的代码与使用产品的代码分离(这个分离是通过多态技术来实现的),从而能在不影响其他代码的情况下扩展产品创建部分代码。例如,如果需要向代码中添加一种新产品,你只需开发新的创建者子类,然后实现其工厂方法即可。
  • 复用现有对象来节省系统资源

工厂方法优缺点

避免创建者和具体产品之间的紧密耦合(产品实例化的地方根本不关心不同产品的差异是什么,差异化的产品通过其带进来的concreteCreator来实现)

单一职责原则:你可以将产品创建代码放在程序的单一位置,从而使代码更容易维护。

开闭原则:无需更改现有客户端代码,你就可以在程序中引入新的产品类型。

缺点:应用工厂方法模式需要引入许多新的子类,代码可能会因此变得更复杂。最好的情况是将该模式引入创建者类的现有层次结构中。(解释:就是说工厂方法模式会引入复杂度,导致类的层次变深;最好的情况是现在已经有了比较清晰的层次结构时,引入工厂方法模式;如果未来的产品扩展并不多,使用简单工厂或者if-else逻辑可能已经最够清晰和简单)

如何引入设计模式

基本的套路就是:先说原来是什么样子的,原来一定是简单的,后来加入了复杂度,其实也就是变化,也就是后来产生了变化,这个变化带来了不可控的代码修改,比如对核心代码做了侵入式修改,对原始代码做了大量的复制,本次修改是霰弹式修改等。更糟糕的是,如果再次产生这样的变化,仍然需要对这些代码做大幅修改

设计模式的作用

  1. 隔离容易变化的和稳定的

发表回复