设计模式-AbstractFactory

回想工厂方法模式,http://blog.csdn.net/caoxing81/article/details/45873605,大厅可能有多种风格,Widget类图如图示
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();

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章