回想工厂方法模式,http://blog.csdn.net/caoxing81/article/details/45873605,大厅可能有多种风格,
A和B的Widget也可能是不同组别不同人进行开发。这种情况下一个工厂类显然对代码结构,程序可维护性有影响。
我们可以创建多个WidgetFactory分别生成A,B类的Widget。
abstractfactory.h
#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H
#include <stdio.h>
class Widget {
public:
virtual void draw() = 0;
};
class AWidget: public Widget {
public:
virtual void draw(){
printf("i am widget use a style!\n");
ondraw();
}
virtual void ondraw() = 0;
};
class BWidget: public Widget {
public:
virtual void draw(){
printf("i am widget use b style!\n");
ondraw();
}
virtual void ondraw() = 0;
};
class AButton: public AWidget {
public:
void ondraw() {
printf("i am an button!\n");
}
};
class AImageView: public AWidget {
public:
void ondraw() {
printf("i am an imageview!\n");
}
};
class BButton: public BWidget {
public:
void ondraw() {
printf("i am an button!\n");
}
};
class BImageView: public BWidget {
public:
void ondraw() {
printf("i am an imageview!\n");
}
};
class AbstractWidgetFactory
{
public:
//virtual Widget* create_widget(const char * type, const char * name) = 0;
};
class AWidgetFactory: public AbstractWidgetFactory
{
public:
AWidgetFactory(){}
~AWidgetFactory(){}
public:
Widget* create_widget(const char * name);
};
class BWidgetFactory: public AbstractWidgetFactory
{
public:
BWidgetFactory(){}
~BWidgetFactory(){}
public:
Widget* create_widget(const char * name);
};
class WidgetFactory {
private:
WidgetFactory(){}
public:
static Widget * create_widget(const char * type, const char * name);
};
#endif // ABSTRACTFACTORY_H
abstractfactory.cpp
#include <string.h>
#include <stdlib.h>
#include "abstractfactory.h"
Widget* AWidgetFactory::create_widget(const char * name) {
if (strcmp(name, "button") == 0) {
return (Widget *)(new AButton());
}
else if (strcmp(name, "image") == 0) {
return new AImageView();
}
return nullptr;
}
Widget* BWidgetFactory::create_widget(const char * name) {
if (strcmp(name, "button") == 0) {
return (Widget *)(new BButton());
}
else if (strcmp(name, "image") == 0) {
return new BImageView();
}
return nullptr;
}
Widget * WidgetFactory::create_widget(const char * type, const char * name) {
if (strcmp(type, "A") == 0) {
AWidgetFactory awf;
return awf.create_widget(name);
}
else if (strcmp(type, "B") == 0) {
BWidgetFactory bwf;
return bwf.create_widget(name);
}
}
main.cpp
#include <stdio.h>
#include <QCoreApplication>
#include "abstractfactory.h"
using namespace std;
int main(int argc, char *argv[])
{
Widget * ab = WidgetFactory::create_widget("A", "button");
ab->draw();
Widget * ai = WidgetFactory::create_widget("B", "image");
ai->draw();
}