您的位置:首页 > 其它

设计模式--抽象工厂模式

2016-05-05 15:00 323 查看

介绍

http://www.runoob.com/design-pattern/abstract-factory-pattern.html

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

创建型模式。





实现

#include <iostream>

#include <string>

using namespace std;

class Shape

{

public:

virtual void Show()=0;

};

class Rectangle :public Shape

{

public:

void Show(){ cout<<"Rectangle"<<endl; }

};

class Circle : public Shape

{

public:

void Show(){ cout<<"Circle"<<endl; }

};

class Color

{

public:

virtual void fill()=0;

};

class Red:public Color

{

public:

void fill(){ cout<<"Red fill method"<<endl;}

};

class Black:public Color

{

public:

void fill(){ cout<<"Black fill method"<<endl;}

};

class AbstractFactory

{

public:

virtual Color* getColor(char* colorType) = 0;

virtual Shape* getShape(char* shapeType) = 0;

};

class ShapeFactory:public AbstractFactory

{

public:

Color* getColor(char* colorType){ return NULL;}

Shape* getShape(char* shapeType)

{

if (!strcmp(shapeType,"RECTANGLE"))

{

return new Rectangle();;

}

else if (!strcmp(shapeType,"CIRCLE"))

{

return new Circle();

}

return NULL;

}

};

class ColorFactory:public AbstractFactory

{

public:

Shape* getShape(char* shapeType){ return NULL;};

Color* getColor(char* colorType)

{

if (!strcmp(colorType,"RED"))

{

return new Red();;

}

else if (!strcmp(colorType,"BLACK"))

{

return new Black();

}

return NULL;

}

};

/*创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。*/

class FactoryProducer

{

public:

AbstractFactory* getFactory(char* factoryType)

{

if (!strcmp(factoryType,"SHAPE"))

{

return new ShapeFactory;

}

else if (!strcmp(factoryType,"COLOR"))

{

return new ColorFactory;

}

return NULL;

}

};

#include "shape.h"

int main()

{

FactoryProducer* all = new FactoryProducer;

AbstractFactory* shapefactory = all->getFactory("SHAPE");

Shape* shape1 = shapefactory->getShape("RECTANGLE");

shape1->Show();

AbstractFactory* colorfactory = all->getFactory("COLOR");

Color* color1 = colorfactory->getColor("RED");

color1->fill();

getchar();

//delete

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: