创建对象最直接的方法就是利用C++提供的构造函数,这种方法的缺点是让代码绑定了具体的类型;一旦该具体类型需要被替换为新的类型,那么程序逻辑就不得不修改;更糟糕的是,可能需要到处修改这样的代码。Open/Close原则的一个要旨是要避免这种修改!如前所述,所有的创建型设计模式解决这个问题的方案都是:基于一个稳定的接口来创建对象。
- 工厂方法模式定义一个抽象接口,由该接口的子类来决定所创建对象的具体类型;
- 原型模式调用Clone()接口来复制一个已经存在的对象;
- 抽象工厂模式则是在工厂方法模式或者原型模式的基础上,进一步隐藏相关类型的相关性;
- Builer模式中Director对象本质上是调用一个模板方法来构造复杂对象,该模板方法隐藏了复杂对象子部件的抽象类型;相同的一个构造过程,能够产生不同的子部件组合;
- 单件模式向客户隐藏了类的构造函数,但提供一个公开的接口来获取一个实例;该模式向客户隐藏了唯一实例的事实。
进一步比较这些接口定义,我们发现,这些接口的抽象程度是逐步加强提高的:
- 单件模式返回了对象的具体类型
- 工厂方法模式返回了对象的抽象类型
- 抽象工厂模式如果由工厂方法模式来构建,则返回子部件的抽象类型;如果由原型模式来实现,则可以隐藏子部件的抽象类型
- 原型模式的Clone()接口由于其通用性,隐藏了对象的抽象类型
- Builder模式完全隐藏子部件的类型
虽然这些模式都是基于接口来创建对象,这些模式的关注点和价值也不尽相同的,总结如下: