文档章节

设计模式-AbstractFactory

神之道道
 神之道道
发布于 2016/04/08 15:52
字数 374
阅读 6
收藏 0

回想工厂方法模式,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();

}

© 著作权归作者所有

神之道道
粉丝 0
博文 12
码字总数 3929
作品 0
深圳
私信 提问
设计模式之抽象工厂模式(创建型)

模式定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 模式角色 抽象...

smileNicky
01/01
0
0
Java设计模式之工厂方法模式与抽象工厂模式

一、前期回顾 上一篇《Java设计模式之单例模式》详细介绍了单例模式,介绍了单例模式的使用场景,优缺点,同时也写了两种常见的单例模式写法,懒汉式单例模式和饿汉氏单例模式,当然,单例模...

木木匠
2018/11/09
23
0
设计模式-抽象工厂模式(C#)

设计模式——抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构。当系统所...

PXZ6603
2018/06/26
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.5K
69

没有更多内容

加载失败,请刷新页面

加载更多

【0918】正则介绍_grep

【0918】正则介绍_grep 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 一、正则介绍 正则是一串有规律的字符串,它使用单个字符串来描述或匹配一系列符合某个语法规则的字符串。 二、grep工具 ...

飞翔的竹蜻蜓
35分钟前
4
0
为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
今天
8
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
今天
4
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
今天
5
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部