C++设计模式(二) GeekBand

“对象创建”模式
通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。其中包括工厂方法(Factory Method),抽象工厂(Abstract Factory),原型模式(Prototype),建造者模式(Builder)。

工厂模式(Factory)

工厂方法(Factory Method)

模式定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。

C++设计模式(二) GeekBand_第1张图片
工厂方法(Factory Method)

工厂提供FactoryMethod()的虚接口,在ConcreteCreator中实现,这里假定有个ConcreteCreator,只生产ConcreteProduct产品。
以ConcreteCreator为例,代码框架如下:

class ConcreteCreator: public Factory
{
    virtual Product* CreateProduct()
    {
        return new ConcreteProduct();
    }
};

在客户端用 Factory *f ; f->CreateProduct();就可以得到ConcreteProduct的对象了。

  • Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
  • Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
  • Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。
抽象工厂(Abstract Factory)

模式定义
提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。

C++设计模式(二) GeekBand_第2张图片
抽象工厂(Abstract Factory)

抽象工厂又是工厂方法的升级版,但本质是相同的。由图可以看到不同的地方在于多了一个抽象产品的类。
ConcreateFactory1只生产ProductA1和ProductB1,即下标带“1”的产品。在ConcreteFactory1中的两个方法应该如下:

AbstractProductA* CreateProductA()
{
      return new ProductA1();
}

AbstractProductB* CreateProductB()
{
      return new ProductB1();
}
  • 如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的工厂完全可以。
  • “系列对象”指的是在某一特定系列下的对象之间有相互依赖或作用的关系。不同系类的对象之间不能相互依赖。
  • Abstract Factory模式主要在与应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。
总结

工厂方法
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别
工厂方法只有一个抽象产品类,而抽象工厂有多个。
工厂方法的具体工厂类只能创建一个具体产品类的实例,而抽象工厂可以创建多个。

你可能感兴趣的:(C++设计模式(二) GeekBand)