工厂模式 C++实现的简单易懂的范例推荐给大家

#pragma once

/*
//说明:简单工厂模式
//文件:Factory.h
//日期:2020/6/23
//作者: coder
//QQ: 375187588
//修改:
//版本:
*//

//通用模板方法
class CFactor
{
public:
    template<class T>
    static T* Create()
    {
        return new T();
    }
};

//返回基类的模板方法,必须继承CBase
class CBase;
class CBaseFactor
{
public:
    template<class T>
    static CBase* Create()
    {
        return new T();
    }
};
 

#pragma once

#include "Factory.h"

/*
//说明:简单工厂要生产的产品
//文件:Product.h
//日期:2020/6/23
//作者: coder
//QQ: 375187588
//修改:
//版本:
*//

//符合开放-封闭原则
//工厂方法模式只能创建一种产品
//组成车的引擎

class CEngine
{
public:
    CEngine()
    {
        std::cout << "组装引擎 !" << std::endl;
    }
    ~CEngine()
    {
        std::cout << "析构引擎 !" << std::endl;
    }
};

//组成车的底盘
class CChassis
{
public:
    CChassis()
    {
        std::cout << "组装底盘 !" << std::endl;
    }
    ~CChassis()
    {
        std::cout << "析构底盘 !" << std::endl;
    }
};

//组成车的轮子
class CWheel
{
public:
    CWheel()
    {
        std::cout << "组装轮子 !" << std::endl;
    }
    ~CWheel()
    {
        std::cout << "析构轮子 !" << std::endl;
    }
};

class IBaseCar
{
public:
    virtual void Create() = 0;
    virtual ~IBaseCar() {};
};

//组装车
class CCar : public IBaseCar
{
public:
    CCar(CEngine* pEngine, CChassis* pChassis, CWheel* pWheel)
    {
        m_pEngine.reset(pEngine);
        m_pChassis.reset(pChassis);
        m_pWheel.reset(pWheel);
    }
    virtual ~CCar()
    {
        std::cout << "CCar 析构了!" << std::endl;
    }
    void Create()
    {
        std::cout << "CCar由引擎,底盘,轮子组合而成!" << std::endl;
    }

private:
    std::shared_ptr<CEngine> m_pEngine;
    std::shared_ptr<CChassis> m_pChassis;
    std::shared_ptr<CWheel> m_pWheel;
};

class IFactor
{
public:
    virtual IBaseCar* Create() = 0;
};

class CCarFactor : public IFactor
{
public:
    IBaseCar* Create()
    {
        return new CCar(new CEngine, new CChassis, new CWheel);
    }
};
 

// 工厂模式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "Product.h"

class ICar
{
public:
    virtual void Create() = 0;
};

class CBMWCar : public ICar
{
public:
    CBMWCar() {}
    ~CBMWCar() {}

    void Create()
    {
        std::cout << "CBMWCard!" << std::endl;
    }
};

class CBenzCar : public ICar
{
public:
    CBenzCar() {}
    ~CBenzCar() {}

    void Create()
    {
        std::cout << "CBenzCar!" << std::endl;
    }
};

class CPorsche : public ICar
{
public:
    CPorsche() {}
    ~CPorsche() {}

    void Create()
    {
        std::cout << "CPorsche!" << std::endl;
    }
};

class CBase
{
public:
    virtual void Create() = 0;
};

class CToyotaCar :public CBase
{
public:
    CToyotaCar() {}
    ~CToyotaCar() {}

    void Create()
    {
        std::cout << "CToyotaCar!" << std::endl;
    }
};

void TestCar()
{
    ICar* pCar = nullptr;
    pCar = CFactor::Create<CBMWCar>();
    pCar->Create();
    delete pCar;

    pCar = CFactor::Create<CBenzCar>();
    pCar->Create();
    delete pCar;

    pCar = CFactor::Create<CPorsche>();
    pCar->Create();
    delete pCar;
}

void TestBaseCar()
{
    CBase* pCar = nullptr;
    pCar = CBaseFactor::Create<CToyotaCar>();
    pCar->Create();
    delete pCar;
}

void TestCarFactor()
{
    CCarFactor factor;
    IBaseCar* pCar = factor.Create();
    pCar->Create();
    delete pCar;
    pCar = nullptr;
}

int main()
{
    std::cout << "Hello World!\n";
    TestCar();
    TestBaseCar();
    TestCarFactor();

    getchar();
    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值