设计模式(3)工厂模式

简单工厂模式

存在一个工厂生产A,B,C三种产品。我们想要写一个程序描述这个过程。

我们可以写一个工厂类负责创建产品,但是产品是不唯一的,我们需要创建一个抽象产品类,然后对于每一种具体的产品,我们就创建对应的具体产品类具体产品类继承自抽象产品类


class Products{//抽象产品类
public:
  virtual ~Products(){}
  virtual void Show() = 0;
};
class A:public Products{
public:
  void Show(){
    cout<<"A"<<endl;
  }
};
class B:public Products{
public:
  void Show(){
    cout<<"B"<<endl;
  }
};
class C:public Products{
public:
  void Show(){
    cout<<"C"<<endl;
  }
};
enum Types{
  A,
  B,
  C
}
class Factory{//负责创建产品的工厂类
public:
  Products *Creat(Types type){
    switch (type){
      case A:
        return new A();
        break;
      case B:
        return new B();
        break;
      case C:
        return new C();
        break;
      default:
        return NULL;
        break;
    }
  }
};

在代码中我们不难发现一件事,当我们需要增加一种新的产品的时候,就需要修改工厂类,这是不够好的,还有一点,我们创建了产品之后需要手动delete掉,这是会有内存泄漏的危险的。

工厂方法模式

和简单工厂模式相比,该模式选择抽象工厂,每一个具体工厂生产对应的具体产品

class Factory{
public:
  virtual product *Creat() = 0;
  virtual ~Factory(){}
};

class AFactory:public Factory{
public:
  product *Creat(){
    return new A();
  }
}

class BFactory:public Factory{
public:
  product *Creat(){
    return new B();
  }
}

class CFactory:public CFactory{
public:
  product *Creat(){
    return new C;
  }
}

这和简单工厂模式类似,但是区别在于将工厂也抽象化了。如果需要增加新的产品我们就需要引入更多的类。

抽象工厂模式

相对于工厂方法模式,抽象工厂模式可以创建不同的铲平。所以新增产品的时候也需要增加对应的产品的具体工厂类。
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下, 你可以使用抽象工厂。

总结

不难发现,新增产品的时候,都存在一定的缺陷:
简单工厂模式,需要修改工厂类,这显然违背了开闭原则。
工厂方式模式和抽象工厂模式,都需要增加一个对应的产品的具体工厂类,这就会增大了代码的编写量。

posted @ 2022-05-24 22:08  Paranoid5  阅读(13)  评论(0编辑  收藏  举报