抽象工厂模式是提供一个接口,用来创建一系列对象的接口。
#include <iostream>
#include <string>
#include <memory>
using namespace std;
/* 抽象工厂模式
* 抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
*/
class IApple
{
public:
IApple() {}
virtual void ShowName() = 0;
};
class ChineseApple : public IApple
{
public:
ChineseApple() {}
virtual void ShowName() { cout << "中国苹果" << endl; }
};
class AmericanApple : public IApple
{
public:
AmericanApple() {}
virtual void ShowName() { cout << "美国苹果" << endl; }
};
class JapaneseApple : public IApple
{
public:
JapaneseApple() {}
virtual void ShowName() { cout << "日本苹果" << endl; }
};
class IPear
{
public:
IPear() {}
virtual void ShowName() = 0;
};
class ChinesePear : public IPear
{
public:
ChinesePear() {}
virtual void ShowName() { cout << "中国鸭梨" << endl; }
};
class AmericanPear : public IPear
{
public:
AmericanPear() {}
virtual void ShowName() { cout << "美国鸭梨" << endl; }
};
class JapanesePear : public IPear
{
public:
JapanesePear() {}
virtual void ShowName() { cout << "日本鸭梨" << endl; }
};
using ApplePtr = std::shared_ptr<IApple>;
using PearPtr = std::shared_ptr<IPear>;
class IFactory
{
public:
IFactory() {}
virtual ~IFactory() {}
virtual ApplePtr CreateApple() = 0;
virtual PearPtr CreatePear() = 0;
};
class ChineseFactory : public IFactory
{
public:
ChineseFactory() {}
virtual ApplePtr CreateApple()
{
return std::make_shared<ChineseApple>();
}
virtual PearPtr CreatePear()
{
return std::make_shared<ChinesePear>();
}
};
class AmericanFactory : public IFactory
{
public:
virtual ApplePtr CreateApple()
{
return std::make_shared<AmericanApple>();
}
virtual PearPtr CreatePear()
{
return std::make_shared<AmericanPear>();
}
};
class JapaneseFactory :public IFactory
{
public:
virtual ApplePtr CreateApple()
{
return std::make_shared<JapaneseApple>();
}
virtual PearPtr CreatePear()
{
return std::make_shared<JapanesePear>();
}
};
int main()
{
std::unique_ptr<IFactory> factoryPtr = std::make_unique<ChineseFactory>();
ApplePtr pApple = factoryPtr->CreateApple();
pApple->ShowName();
PearPtr pPear = factoryPtr->CreatePear();
pPear->ShowName();
}