设计模式(二):抽象工厂模式

设计模式(二):抽象工厂模式

定义:

​ ·提供一个创建一系列相关或互相依赖对象的接口,只需要知道对象的系列,无需知道具体的对象。

​ ·在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

主要解决:

​ ·接口选择的问题。

何时使用:

​ ·系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

以代码为例:

​ 类关系图如下

在这里插入图片描述

根据类图:

一、创建两个产品族,产品A和产品B,

class ProductA//产品A
{
public:
  virtual ~ProductA() {}  
  
  virtual const char* getName() = 0;
  // ...
};

class ProductB//产品B
{
public:
  virtual ~ProductB() {}
  
  virtual const char* getName() = 0;
  // ...
};

二、分别创建产品A和产品B的实例类产品等级X和Y

class ConcreteProductAX : public ProductA//产品AX
{
public:
  ~ConcreteProductAX() {}
  
  const char* getName()
  {
    return "A-X";
  }
  // ...
};

class ConcreteProductAY : public ProductA//产品AY
{
public:
  ~ConcreteProductAY() {}
  
  const char* getName()
  {
    return "A-Y";
  }
  // ...
};


class ConcreteProductBX : public ProductB//产品BX
{
public:
  ~ConcreteProductBX() {}
  
  const char* getName()
  {
    return "B-X";
  }
  // ...
};

class ConcreteProductBY : public ProductB//产品BY
{
public:
  ~ConcreteProductBY() {}
  
  const char* getName()
  {
    return "B-Y";
  }
  // ...
};

三、创建抽象工厂类

class AbstractFactory
{
public:
  virtual ~AbstractFactory() {}
  
  virtual ProductA *createProductA() = 0;//声明创造产品A的纯虚函数
  virtual ProductB *createProductB() = 0;//声明创造产品B的纯虚函数
};

这里抽象工厂类中最重要的是声明的这两个纯虚函数。

四、创建实例抽象工厂类

class ConcreteFactoryX : public AbstractFactory
{
public:
  ~ConcreteFactoryX() {}
  
  ProductA *createProductA()
  {
    return new ConcreteProductAX();
  }
  ProductB *createProductB()
  {
    return new ConcreteProductBX();
  }
  // ...
};

class ConcreteFactoryY : public AbstractFactory
{
public:
  ~ConcreteFactoryY() {}

  ProductA *createProductA()
  {
    return new ConcreteProductAY();
  }
  ProductB *createProductB()
  {
    return new ConcreteProductBY();
  }
  // ...
};

这里声明工厂X和工厂Y来分别实现生产A和B对应的X和Y产品。

五、使用main函数调用

int main()
{
  ConcreteFactoryX *factoryX = new ConcreteFactoryX();
  ConcreteFactoryY *factoryY = new ConcreteFactoryY();

  ProductA *p1 = factoryX->createProductA();
  std::cout << "Product: " << p1->getName() << std::endl;
  
  ProductA *p2 = factoryY->createProductA();
  std::cout << "Product: " << p2->getName() << std::endl;
  
  delete p1;
  delete p2;
  
  delete factoryX;
  delete factoryY;
  
  return 0;
}

这样就实现了一个简单的抽象工厂模式

抽象工厂模式的优缺点:

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

**注意事项:**产品族难扩展,产品等级易扩展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值