C++设计模式 -> 创建型 -> 抽象工厂(Abstract Factory)

抽象工厂模式(Abstract Factory)

——————— 抽象工厂 | 具体工厂 ————————–

这里写图片描述

——————— 抽象产品 | 具体产品 ————————–

这里写图片描述

逻辑

这里写图片描述

头文件


Base_Factory.h

#ifndef FACTORY_H
#define FACTORY_H

#include "Base_Product.h"


/* 抽象工厂 */
class Base_Factory
{
public:
    enum FACTORY_TYPE
    {
        BENZ_FACTORY,  /* 奔驰工厂 */
        BMW_FACTORY,   /* 宝马工厂 */
    };
    /* 实例化具体工厂 */
    static bool Base_Factory::Create_Factory(Base_Factory*& base_factory_index,
                                             FACTORY_TYPE   factory);
    /* 生产汽车 */
    virtual Base_Car* Create_Car() = 0;
    /* 生产自行车 */
    virtual Base_Bike* Create_Bike() = 0;



protected:

private:

};

#endif // FACTORY_H

Concrete_Factory.h

#ifndef CONCRETE_FACTORY_H
#define CONCRETE_FACTORY_H
#include "Base_Factory.h"
#include "concrete_product.h"

/* 奔驰工厂 */
class Benz_Factory : public Base_Factory
{
public:
    Base_Car* Create_Car(){
        return new Benz_Car;
    }

    Base_Bike* Create_Bike(){
        return new Benz_Bike;
    }
protected:
private:
};

/* 宝马工厂 */
class Bmw_Factory : public Base_Factory
{
public:
    Base_Car* Create_Car(){
        return new Bmw_Car;
    }

    Base_Bike* Create_Bike(){
        return new Bmw_Bike;
    }
protected:
private:
};


#endif // CONCRETE_FACTORY_H

Base_Product.h

#ifndef Produce_H
#define Produce_H

#include <string>

using namespace std;

// 抽象汽车类
class Base_Car
{
public:
    virtual string Produce_Car() = 0;  // 生产汽车

protected:

private:
};

// 抽象自行车类
class Base_Bike
{

public:
    virtual string Produce_Bike() = 0;  // 生产自行车

protected:

private:

};

#endif // Produce_H

Concrete_Product.h

#ifndef CONCRETE_Produce_H
#define CONCRETE_Produce_H
#include "Base_Product.h"
/********** 汽车 **********/
// 奔驰
class Benz_Car : public Base_Car
{
public:
    string Produce_Car(){
        return "  Benz Car   ";
    }
protected:
private:
};

// 宝马
class Bmw_Car : public Base_Car
{
public:
    string Produce_Car(){
        return "   Bmw Car  ";
    }
protected:
private:
};

/********** 自行车 **********/
// 奔驰
class Benz_Bike : public Base_Bike
{
public:
    string Produce_Bike(){
        return "  Benz Bike  ";
    }
protected:
private:
};

// 宝马
class Bmw_Bike : public Base_Bike
{
public:
    string Produce_Bike(){
        return "  Bmw Bike  ";
    }
protected:
private:
};



#endif // CONCRETE_Produce_H

源文件


create_factory.cpp

#include "Base_Factory.h"
#include "concrete_factory.h"

/* 实例具体工厂 */
bool Base_Factory::Create_Factory(Base_Factory*& base_factory_index, FACTORY_TYPE factory)
{
    switch (factory)
    {
        // 奔驰工厂
    case FACTORY_TYPE::BENZ_FACTORY:
        base_factory_index = new Benz_Factory;
        break;

        // 宝马工厂
    case FACTORY_TYPE::BMW_FACTORY:
        base_factory_index = new Bmw_Factory;
        break;

    default:
        return false;

    }
    return true;
}

main.cpp

#include "Base_Factory.h"
#include "Base_Product.h"
#include <iostream>

using namespace std;

#ifndef SAFE_DELETE
#define SAFE_DELETE(index) { if(index){delete(index); (index)=NULL;} }
#endif

int main()
{
    Base_Factory* base_factory_index = NULL;
    Base_Car* car_index = NULL;
    Base_Bike* bike_index = NULL;

    // 奔驰
    Base_Factory::Create_Factory(base_factory_index, Base_Factory::FACTORY_TYPE::BENZ_FACTORY);
    car_index = base_factory_index->Create_Car();
    bike_index = base_factory_index->Create_Bike();

    cout << car_index->Produce_Car() << endl;
    cout << bike_index->Produce_Bike() << endl;

    SAFE_DELETE(car_index);
    SAFE_DELETE(bike_index);
    SAFE_DELETE(base_factory_index);

    // 宝马
    Base_Factory::Create_Factory(base_factory_index, Base_Factory::FACTORY_TYPE::BMW_FACTORY);
    car_index = base_factory_index->Create_Car();
    bike_index = base_factory_index->Create_Bike();

    cout << car_index->Produce_Car() << endl;
    cout << bike_index->Produce_Bike() << endl;

    SAFE_DELETE(car_index);
    SAFE_DELETE(bike_index);
    SAFE_DELETE(base_factory_index);


    getchar();

    return 0;
}

出处参考:http://blog.csdn.net/liang19890820/article/details/66974516


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值