设计模式的实现(C++)------抽象工厂模式(AbstractFactory)

创建型模式(1)---抽象工厂模式

 

①定义:

      如果客户端需要创建一个产品结构,而这写产品结构又属于不同的产品类别,则可以考虑使用抽象工厂模式,抽象工厂模式中的抽象工厂类负责创建对象的接口。这一系列的产品结构的实现则交给实现抽象工厂类的具体工厂类来完成。

 

②原理:

      抽象工厂模式主要由四部分组成:抽象工厂类、实现抽象工厂的具体工厂类、抽象类以及实现抽象类的具体对象类。

 

③优点:

      客户端不负责对象的创建,而交由实现抽象工厂类的具体工厂类去完成,客户端只负责对象的调用,明确了各个类的职责。

      当一系列相互关联的类被设计到一个工厂类的时候,客户端的调用就变得非常简单;如果需要更换一个产品系列的话,只需要更换一个工厂类就可以了。

 

④缺点:

      如果有新的产品加进来的话,就需要修改抽象工厂类,并同时修改实现这个抽象工厂类的具体工厂类,需要额外编写代码,增加了工作量,也违背了开放封闭原则。

 

⑤代码:

AbstractFactory.h:

#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H

//产品A抽象类
class ProductA
{
public:
 virtual ~ProductA(){};
 //类A的动作
 virtual void doProA() = 0;
};

//产品B抽象类
class ProductB
{
public:
 virtual ~ProductB(){};
 //类B的动作
 virtual void doProB() = 0;
};

//抽象工厂类
class AbstractFactory{
public:
 virtual ~AbstractFactory(){};
 //创建产品A
 virtual ProductA* createProductA() = 0;
 //创建产品B
 virtual ProductB* createProductB() = 0;
};

//创建产品系列工厂1
class ProductFactory1 : public AbstractFactory
{
public:
 ProductFactory1();
 virtual ~ProductFactory1();
 ProductA* createProductA();
 ProductB* createProductB();
};

//具体产品类A1
class ProductA1 : public ProductA
{
public:
 ProductA1();
 virtual ~ProductA1();
 void doProA();
};

//具体产品类B1
class ProductB1 : public ProductB
{
public:
 ProductB1();
 virtual ~ProductB1();
 void doProB();
};

#endif

 

AbstractFactory.cpp

 

#include "AbstractFactory.h"
#include <iostream>
using namespace std;

ProductFactory1::~ProductFactory1()
{
 cout<<"Delete ProductFactory1"<<endl;
}

ProductFactory1::ProductFactory1()
{
 cout<<"Create ProductFactory1"<<endl;
}

ProductA* ProductFactory1::createProductA()
{
 return new ProductA1();
}

ProductB* ProductFactory1::createProductB()
{
 return new ProductB1();
}

ProductA1::ProductA1()
{
 cout<<"Create ProductA1"<<endl;
}

ProductA1::~ProductA1()
{
 cout<<"Delete ProductA1"<<endl;
}

void ProductA1::doProA()
{
 cout<<"action of the ProductA1"<<endl;
}

ProductB1::ProductB1()
{
 cout<<"Create ProductB1"<<endl;
}

ProductB1::~ProductB1()
{
 cout<<"Delete ProductB1"<<endl;
}

void ProductB1::doProB()
{
 cout<<"action of the ProductB1"<<endl;
}

 

测试代码:

int main(){
 cout<<"Abstract Factory start"<<endl;

 //创建工厂接口
 AbstractFactory* factory = new ProductFactory1();

 //创建产品A1
 ProductA* pA1  = factory->createProductA();
 pA1->doProA();

 //创建产品B1
 ProductB* pB1  = factory->createProductB();
 pB1->doProB();

 //删除对象
 delete factory;
 delete pA1;
 delete pB1;
 return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值