C++实现26种设计模式——工厂模式

C++实现26种设计模式之——工厂模式先看运行再来看main函数:源码(工厂类)源码(产品类)完整源码谨以此系列文,纪念被设计模式整懵逼的那些年。笔者没看过设计模式书,仅仅在工作中用过26种设计模式中的几种,其余大部分都是看demo代码。所以有错漏的地方,请各位老爷批评指正。而代码是年前大佬甩给我的,当时没时间细究,现在终于闲下来好好研究了,所以demo代码从哪儿下的笔者也不知(对那位写下的...
摘要由CSDN通过智能技术生成


谨以此系列文,纪念被设计模式整懵逼的那些年。
笔者没看过设计模式书,仅仅在工作中用过26种设计模式中的几种,其余大部分都是看demo代码。所以有错漏的地方,请各位兄弟批评指正。
而代码是年前大佬甩给我的,当时没时间细究,现在终于闲下来好好研究了,所以demo代码从哪儿下的笔者也不知(对那位写下的demo的老兄表示感谢和歉意,真心不是侵权)。
而学习间,笔者亦将demo代码改了许多,感谢开源,回馈开源,笔者接下来的代码也全部贴出,不用下载。

先看运行

以结果为导向,来看待问题,会清晰得多:
在这里插入图片描述
有三个厂,分别是:奔驰、宝马、奥迪;
于是,有三款产品,分别是:单车、汽车、摩托;
所以,工厂模式运用起来,大概应该是这样的效果:XX厂生产XX产品。

再来看main函数:

int main()
{
	// 奔驰
	AbstractFactory* pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::BENZ_FACTORY);
	ICarProduct *pCar = pFactory->CreateCar();
	IBikeProduct *pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pCar->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);
	
	// 宝马
	pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::BMW_FACTORY);
	IMotoBikeProduct* pMoto = pFactory->CreateMotoBike();
	pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pMoto->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	// 奥迪
	pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::AUDI_FACTORY);
	pMoto = pFactory->CreateMotoBike();
	pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pMoto->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	system("pause");
}

看着这样齐整的代码,咱再来想,要如何实现后面的类,才能实现后面的效果。
首先,很明显,AbstractFactory是个抽象工厂,CreateFactory也肯定是个静态函数,而这个函数就是通过FACTORY_TYPE这个枚举,来区分new出不同的工厂来的。
其次,不同的工厂,能创造出不同的产品(CreateCar()、CreateBike()、CreateMotoBike()),不用说肯定是多态,所以,工厂模式该怎么写,也大概能推断出来了。

源码(工厂类)

class AbstractFactory {
public:
	AbstractFactory() {}
	~AbstractFactory() {}
	virtual IBikeProduct* CreateBike() = 0;
	virtual IMotoBikeProduct* CreateMotoBike() = 0;
	virtual ICarProduct* CreateCar() = 0;

	static AbstractFactory* CreateFactory(FACTORY_TYPE type);

	string Name() { return m_name; }

protected:
	string m_name;
};


class BenChiFactory : public AbstractFactory {
public:
	BenChiFactory() { m_name = "奔驰"; }
	~BenChiFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }
};

class BaoMaFactory : public AbstractFactory {
public:
	BaoMaFactory() { m_name = "宝马"; }
	~BaoMaFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }

};

class AodiFactory : public AbstractFactory {
public:
	AodiFactory() { m_name = "奥迪"; }
	~AodiFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }

};

AbstractFactory* AbstractFactory::CreateFactory(FACTORY_TYPE type) {
	switch (type)
	{
	case BENZ_FACTORY:
	{
		return new BenChiFactory;
	}
	break;
	case BMW_FACTORY:
	{
		return new BaoMaFactory;
	}
	break;
	case AUDI_FACTORY:
	{
		return new AodiFactory;
	}
	break;
	default:
		break;
	}
}

源码(产品类)

class IProduct {
public:
	IProduct() {}
	~IProduct() {}
	string Name() { return m_name; }
protected:
	string m_name;
};

enum FACTORY_TYPE {
	BENZ_FACTORY = 0,
	BMW_FACTORY,
	AUDI_FACTORY
};

class IBikeProduct : public IProduct {
public:
	IBikeProduct() { m_name = "单车"; }
};

class IMotoBikeProduct : public IProduct {
public:
	IMotoBikeProduct() { m_name = "摩托"; }
};

class ICarProduct : public IProduct {
public:
	ICarProduct() { m_name = "汽车"; }

};

完整源码

#include "pch.h"
#include <iostream>
#include <string>

using namespace std;

#ifndef SAFE_DELETE(p) 
#define SAFE_DELETE(p){if(p){delete p; p = nullptr;}}
#endif

class IProduct {
public:
	IProduct() {}
	~IProduct() {}
	string Name() { return m_name; }
protected:
	string m_name;
};

enum FACTORY_TYPE {
	BENZ_FACTORY = 0,
	BMW_FACTORY,
	AUDI_FACTORY
};

class IBikeProduct : public IProduct {
public:
	IBikeProduct() { m_name = "单车"; }
};

class IMotoBikeProduct : public IProduct {
public:
	IMotoBikeProduct() { m_name = "摩托"; }
};

class ICarProduct : public IProduct {
public:
	ICarProduct() { m_name = "汽车"; }

};


class AbstractFactory {
public:
	AbstractFactory() {}
	~AbstractFactory() {}
	virtual IBikeProduct* CreateBike() = 0;
	virtual IMotoBikeProduct* CreateMotoBike() = 0;
	virtual ICarProduct* CreateCar() = 0;

	static AbstractFactory* CreateFactory(FACTORY_TYPE type);

	string Name() { return m_name; }

protected:
	string m_name;
};


class BenChiFactory : public AbstractFactory {
public:
	BenChiFactory() { m_name = "奔驰"; }
	~BenChiFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }
};

class BaoMaFactory : public AbstractFactory {
public:
	BaoMaFactory() { m_name = "宝马"; }
	~BaoMaFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }

};

class AodiFactory : public AbstractFactory {
public:
	AodiFactory() { m_name = "奥迪"; }
	~AodiFactory() {}

	IBikeProduct* CreateBike() { return new IBikeProduct; }
	IMotoBikeProduct* CreateMotoBike() { return new IMotoBikeProduct; }
	ICarProduct* CreateCar() { return new ICarProduct; }

};

AbstractFactory* AbstractFactory::CreateFactory(FACTORY_TYPE type) {
	switch (type)
	{
	case BENZ_FACTORY:
	{
		return new BenChiFactory;
	}
	break;
	case BMW_FACTORY:
	{
		return new BaoMaFactory;
	}
	break;
	case AUDI_FACTORY:
	{
		return new AodiFactory;
	}
	break;
	default:
		break;
	}
}


int main()
{
	// 奔驰
	AbstractFactory* pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::BENZ_FACTORY);
	ICarProduct *pCar = pFactory->CreateCar();
	IBikeProduct *pBike = pFactory->CreateBike();

	cout << pFactory->Name() << pCar->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	// 宝马
	pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::BMW_FACTORY);
	IMotoBikeProduct* pMoto = pFactory->CreateMotoBike();
	pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pMoto->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	// 奥迪
	pFactory = AbstractFactory::CreateFactory(FACTORY_TYPE::AUDI_FACTORY);
	pMoto = pFactory->CreateMotoBike();
	pBike = pFactory->CreateBike();
	cout << pFactory->Name() << pMoto->Name() << endl;
	cout << pFactory->Name() << pBike->Name() << endl;

	SAFE_DELETE(pCar);
	SAFE_DELETE(pBike);
	SAFE_DELETE(pFactory);

	system("pause");
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值