美文网首页
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

    “对象创建”模式通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支...

  • GeekBand C++设计模式

    5.对象创建 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持...

  • GeekBand C++设计模式 第二周

    5.对象创建 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持...

  • 设计模式二【GeekBand】

    ABSTRACT FACTORY(抽象工厂)—对象创建型模 意图 提供一个创建一系列相关或相互依赖对象的接口,而无...

  • c++设计模式(一)--GeekBand

    一 策略模式策略模式和 Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽...

  • 【geekband】C++设计模式1

    具体详见我的博客:(作业的码在博客最后)design patterns责任是思考面向对象设计的一个观点从概念层面,...

  • C++设计模式(一) GeekBand

    好的软件设计是多用代码复用,但实际设计中却要遇到许多变化,而变化是复用的天敌。为了能够尽量减少变化所带来的设计复杂...

  • C++设计模式(三) GeekBand

    “对象性能”模式 面向对象很好地解决了“抽象”的问题,但是不可避免地要付出一定的代价。对于通常情况来讲,面向对象的...

  • GeekBand C++设计模式(三)

    这里,对设计模式的概念就不细说了,凡是用过或者看过这方面书籍的都应该有所了解。 鄙人认为正是设计模式的出现,使得C...

  • [GeekBand] C++设计模式-2

    Factory Method 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类...

网友评论

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

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