C++实现26种设计模式之——工厂模式
谨以此系列文,纪念被设计模式整懵逼的那些年。
笔者没看过设计模式书,仅仅在工作中用过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");
}