【嵌入式c++】设计模式之工厂模式-简单工厂模式(simple Factory)

题目描述:

Factory

动机(motivation)

实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象。

模式定义

根据需求创建对象的种类。
——《设计模式》GoF

要点总结

有时会和其他模式解和使用,我们无需提供具体的子类类名,只需要提供一个字符串即可得到相应的实例对象。这样的话,当子类的类名更换或者增加子类时我们都无需修改客户端代码,只需要在简单工厂类上增加一个分支判断代码即可。

代码结构

.
├── build.sh
├── clearBuild.sh
├── CMakeLists.txt
├── src 
│   ├── examStu.cpp
│   ├── include
│   │   └── examStu.h
│   └── main.cpp

源码例子

examStu.h

#ifndef _EXANSTU__
#define _EXANSTU__
#include <iostream>
#include <string>
#include <vector>
using namespace std;


typedef enum _eShoesType{

    SHOES_TYPE_BASE = 0,

    SHOES_TYPE_NIKE = 1,
    SHOES_TYPE_ADIDAS = 2,
    SHOES_TYPE_HUILI = 3,

    SHOES_TYPE_ERROR = -1
}eShoesType;

class ShoesBase
{
public:

    ShoesBase(){cout << "ShoesBase() called"<<endl;}
    virtual ~ShoesBase(){cout << "~ShoesBase() called"<<endl;}

    virtual void ShowTag()=0;

private:
    int _shoesBase;
};

class NikeShoes :public ShoesBase
{
public:
    NikeShoes(){cout << "NikeShoes() called"<<endl;}
    virtual ~NikeShoes(){cout << "~NikeShoes() called"<<endl;}

    void ShowTag() override {cout << "NikeShoes::ShowTag() called"<<endl;}

private:

};


class AdidasShoes: public ShoesBase
{
public:
    AdidasShoes(){cout << "AdidasShoes() called"<<endl;}
    virtual ~AdidasShoes(){cout << "~AdidasShoes() called"<<endl;}

    void ShowTag() override {cout << "AdidasShoes::ShowTag() called"<<endl;}

};

class HuiLiShoes: public ShoesBase
{
public:
    HuiLiShoes(){cout << "HuiLiShoes() called"<<endl;}
    virtual ~HuiLiShoes(){cout << "~HuiLiShoes() called"<<endl;}

    void ShowTag() override {cout << "HuiLiShoes::ShowTag() called"<<endl;}

};



class ShoesFactory
{
public:
    ShoesFactory(){cout << "ShoesFactory() called"<<endl;}
    virtual ~ShoesFactory(){cout << "~ShoesFactory() called"<<endl;}

    std::shared_ptr<ShoesBase> CreateShoes(eShoesType shoesType);

};

#endif

examStu.cpp

#include<iostream>
#include<string>
#include <memory>
#include"examStu.h"

using namespace std;



std::shared_ptr<ShoesBase> ShoesFactory::CreateShoes(eShoesType shoesType)
{
    cout << "create sheoes class"<<endl;
    std::shared_ptr<ShoesBase> pShoes = nullptr;

    switch(shoesType)
    {
        case SHOES_TYPE_NIKE:
            cout << "create nike class "<<endl;
            pShoes = std::make_shared<NikeShoes>();
            break;
        case SHOES_TYPE_ADIDAS:
            cout << "create AdidasShoes class"<<endl;
            pShoes = std::make_shared<AdidasShoes>();
            break;  
        case SHOES_TYPE_HUILI:
            cout << "create HuiLiShoes class"<<endl;
            pShoes = std::make_shared<HuiLiShoes>();
            break;   
        default:
             cout << "create shoes type not found!!"<<endl;
            break;
    }
    if(pShoes == nullptr)
    {
        cout << "create shoes class error!!"<<endl;
    }

    return pShoes;
}

main.cpp

#include <iostream>
#include <string.h>
#include <memory>
#include "examStu.h"

using namespace std;


int main(int argc, char *argv[])
{
    ShoesFactory shoesFactory;

    std::shared_ptr<ShoesBase> pHuiLishoes = shoesFactory.CreateShoes(SHOES_TYPE_HUILI);
    pHuiLishoes->ShowTag();   

    std::shared_ptr<ShoesBase> pNikeshoes = shoesFactory.CreateShoes(SHOES_TYPE_NIKE);
    pNikeshoes->ShowTag();

    std::shared_ptr<ShoesBase> pAdidasshoes = shoesFactory.CreateShoes(SHOES_TYPE_ADIDAS);
    pAdidasshoes->ShowTag();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值