設計模式-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();

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