美文网首页
C++设计模式(二) GeekBand

C++设计模式(二) GeekBand

作者: CharlesW | 来源:发表于2016-07-19 09:29 被阅读0次

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

    工厂模式(Factory)

    工厂方法(Factory Method)

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

    工厂方法(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)

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

    抽象工厂(Abstract Factory)

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

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

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

    相关文章

      网友评论

          本文标题:C++设计模式(二) GeekBand

          本文链接:https://www.haomeiwen.com/subject/ljjmjttx.html