本周进入到C++设计模式的第二周学习。
本周接触的有如下方法,这些方法都是为了解决实际设计过程中的紧耦合而诞生的。就着重介绍一些印象比较深的吧。
8. 工厂方法
事实上,工厂方法在之前的模板方法中曾经出现过一次,但是并没有详细说明。
工厂方法在例子中,为了解决splitter在编译时就需要new出来的编译时耦合的问题,而产生的。因此,我们想到可以利用C++的虚函数来讲编译时耦合进行延迟,变为运行时耦合。那么就需要把不同的splitter通过一个基类的抽象来实现,通过基类指针指向的子类对象来调用虚函数,从而实现不同的功能。然而,这么下来看似解耦了,但为了让用户使用,还是需要用到new的方法来为基类指针赋值,这又出现了编译时依赖,影响了代码的复用和稳定。于是,通过创建一个抽象的工厂基类,让所有的splitter子类都有对应的一个工厂子类,让工厂来创建子类对象,这样,在主要代码中,只需要传入工厂基类指针,调用其创建splitter子类的虚函数,就能得到一个splitter子类,并赋值给splitter基类指针。splitter功能就通过splitter基类指针的虚函数调用来实现。到这里,我们就成功的将原来的new从主要代码中集中到了未来可能发生变化的splitter子类与其工厂子类了。不管splitter子类的实现如何变化,为了增加多少splitter子类及其工厂,都不会影响主要代码。
9. 抽象工厂
抽象工厂事实上是工厂模式的延伸,例如在工厂模式中,通过若干个工厂创建了若干个系列的子类对象,这些子类对象之间存在依赖性的话,那么就应该将它们各自的工厂根据依赖性原则进行组合,形成抽象工厂(家庭工厂)。抽象工厂创建其对象时,就能够保证具有依赖性的对象能顺利运行。
10. 原型模式
原型模式,另一种松耦合模式。当需要产生的对象具有某些繁琐操作才能达到的状态时,使用工厂模式将会有极大的效率问题或者某些情况下无法达到时,用原型模式,将存放在类中的原型拷贝一份新的对象出来,从而达到生成对象的目的。当然,此时的拷贝必须是深拷贝。
11. 构建器
12. 门面模式
13. 代理模式
14. 适配器
适配器事实上比较熟悉了,之前在泛型编程中就有通过queue和stack内部用deque来适配的例子。