设计模式的实现(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
    评论
Abstract Factory Pattern是一种设计模式,它是创建对象的工厂模式的变体,允许对象在运行时被替换。 Abstract Factory模式提供了一种方法,可以创建一组相关或相互依赖的对象,而不需要明确指定其具体类。 下面是一个C语言的代码示例,该代码实现了一个抽象工厂模式,该模式创建一组车辆: ```c #include <stdio.h> typedef struct IVehicle IVehicle; struct IVehicle { void (*Drive)(IVehicle *); }; typedef struct Car Car; struct Car { IVehicle base; int wheelCount; }; void Car_Drive(IVehicle *vehicle) { Car *car = (Car *)vehicle; printf("Driving a car with %d wheels\n", car->wheelCount); } typedef struct Bike Bike; struct Bike { IVehicle base; int pedalCount; }; void Bike_Drive(IVehicle *vehicle) { Bike *bike = (Bike *)vehicle; printf("Riding a bike with %d pedals\n", bike->pedalCount); } typedef struct IVehicleFactory IVehicleFactory; struct IVehicleFactory { IVehicle *(*CreateVehicle)(IVehicleFactory *); }; typedef struct CarFactory CarFactory; struct CarFactory { IVehicleFactory base; }; IVehicle *CarFactory_CreateVehicle(IVehicleFactory *factory) { Car *car = (Car *)malloc(sizeof(Car)); car->base.Drive = &Car_Drive; car->wheelCount = 4; return (IVehicle *)car; } typedef struct BikeFactory BikeFactory; struct BikeFactory { IVehicleFactory base; }; IVehicle *BikeFactory_CreateVehicle(IVehicleFactory *factory) { Bike *bike = (Bike *)malloc(sizeof(Bike)); bike->base.Drive = &Bike_Drive; bike->pedalCount = 2; return (IVehicle *)bike; } int main(int argc, char *argv[]) { CarFactory carFactory = { { &CarFactory_CreateVehicle } }; IVehicle *vehicle = carFactory.base.CreateVehicle((IVehicleFactory *)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gosenkle

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值