工厂模式(FactoryPattern)与简单工厂模式相比较,最大的不同在于对工厂本身做了一层抽象,工厂实例通过抽象工厂来产生。
在这种模式下,可以产生不同的工厂,不同的工厂又能够生产不同的产品。
FactoryPattern.h
#pragma once
#include<iostream>
#include<string>
class Fruit // 创建水果类的抽象接口类
{
public:
virtual Fruit* getFruit() = 0;
private:
protected:
};
class Banana :public Fruit
{
public:
Fruit * getFruit(void) { std::cout << "香蕉》》》" << std::endl; return this; };
private:
protected:
};
class Apple :public Fruit
{
public:
Fruit * getFruit(void) { std::cout << "苹果》》》" << std::endl; return this; };
private:
protected:
};
// 与简单工厂最大的不同在于抽象工厂的存在
class AbstractFactoryPattern
{
public:
AbstractFactoryPattern() {};
~AbstractFactoryPattern() {};
virtual AbstractFactoryPattern* cleatProductFactory() = 0; //创建工厂的接口
};
// 创建抽象的水果工厂
class AbstractFruitFactoryPattern:public AbstractFactoryPattern
{
public:
AbstractFruitFactoryPattern() {};
~AbstractFruitFactoryPattern() {};
AbstractFactoryPattern* cleatProductFactory() { return this; }
virtual Fruit* getFruit() = 0;
};
// 创建具体的香蕉工厂
class BananaFactoryPattern :public AbstractFruitFactoryPattern
{
public:
BananaFactoryPattern() {};
~BananaFactoryPattern() {};
Fruit* getFruit() { std::cout << "香蕉》》》" << std::endl; return new Banana; };
};
// 创建具体的苹果工厂
class AppleFactoryPattern :public AbstractFruitFactoryPattern
{
public:
AppleFactoryPattern() {};
~AppleFactoryPattern() {};
Fruit* getFruit() { std::cout << "苹果》》》" << std::endl; return new Apple; };
};
class FactoryPattern
{
public:
FactoryPattern() {};
~FactoryPattern() {};
};
FactoryPattern.cpp
#include "FactoryPattern.h"
mainTest.cpp
#include<iostream>
#include"FactoryPattern.h"
int main(void)
{
// 创建一个香蕉工厂 BananaFactoryPattern
BananaFactoryPattern* bananaFactoryPattern= dynamic_cast<BananaFactoryPattern*>(dynamic_cast<AbstractFruitFactoryPattern*>(new BananaFactoryPattern)->cleatProductFactory());
Banana* banana= dynamic_cast<Banana*> (bananaFactoryPattern->getFruit());
delete banana;
delete bananaFactoryPattern;
// 创建一个苹果工厂 AppleFactoryPattern
AppleFactoryPattern* appleFactoryPattern= dynamic_cast<AppleFactoryPattern*>(dynamic_cast<AbstractFruitFactoryPattern*>(new AppleFactoryPattern)->cleatProductFactory());
Apple* apple = dynamic_cast<Apple*> (appleFactoryPattern->getFruit());
delete apple;
delete appleFactoryPattern;
system("pause");
return 0;
}