• Appreciation to our TA, +7, who designed this task.

Client.cpp

#include <iostream>
#include <string>
#include "Factory.hpp"
#include "Product.hpp"
int main() {
UIFactory* ui = 0;
int choose;
std::cin >> choose;
switch (choose) {
case 0:
ui = new MFCUIFactory();
break;
case 1:
ui = new GtkUIFactory();
break;
case 2:
default:
ui = new QtUIFactory();
}
/* Use the factory to build interface. */
Window* toolbox = ui->getToolboxWindow();
Window* layers = ui->getLayersWindow();
Window* main = ui->getMainWindow();
/* See what have we recieved. */
std::cout << toolbox->getToolkit() << ":" << toolbox->getType() << std::endl;
std::cout << layers->getToolkit() << ":" << layers->getType() << std::endl;
std::cout << main->getToolkit() << ":" << main->getType() << std::endl;
ui->deleteWindow(toolbox);
ui->deleteWindow(layers);
ui->deleteWindow(main);
delete ui;
}

Product.hpp

#ifndef PRODUCT_HPP
#define PRODUCT_HPP
#include <iostream>
#include <string>
using namespace std;
class Window {
public:
virtual string getToolkit() = 0;
virtual string getType() = 0;
string kit;
};
class ToolboxWindow:public Window {
public:
ToolboxWindow(string a) {
kit = a;
}
virtual string getToolkit() {
return kit;
}
virtual string getType() {
return "ToolboxWindow";
}
};
class LayersWindow:public Window {
public:
LayersWindow(string a) {
kit = a;
}
virtual string getToolkit() {
return kit;
}
virtual string getType() {
return "LayersWindow";
}
};
class MainWindow:public Window {
public:
MainWindow(string a) {
kit = a;
}
virtual string getToolkit() {
return kit;
}
virtual string getType() {
return "MainWindow";
}
};
#endif

Factory.hpp

#ifndef FACTORY_HPP
#define FACTORY_HPP
#include <iostream>
#include <string>
#include "Product.hpp"
using namespace std;
class UIFactory {
public:
virtual Window* getToolboxWindow() = 0;
virtual Window* getLayersWindow() = 0;
virtual Window* getMainWindow() = 0;
virtual void deleteWindow(Window* a) = 0;
};
class MFCUIFactory:public UIFactory {
public:
MFCUIFactory() {}
virtual Window* getToolboxWindow() {
return new ToolboxWindow("MFC");
}
virtual Window* getLayersWindow() {
return new LayersWindow("MFC");
}
virtual Window* getMainWindow() {
return new MainWindow("MFC");
}
virtual void deleteWindow(Window* a) {
delete a;
}
};
class GtkUIFactory:public UIFactory {
public :
GtkUIFactory() {}
virtual Window* getToolboxWindow() {
return new ToolboxWindow("Gtk");
}
virtual Window* getLayersWindow() {
return new LayersWindow("Gtk");
}
virtual Window* getMainWindow() {
return new MainWindow("Gtk");
}
virtual void deleteWindow(Window* a) {
delete a;
}
};
class QtUIFactory:public UIFactory {
public:
QtUIFactory() {}
virtual Window* getToolboxWindow() {
return new ToolboxWindow("Qt");
}
virtual Window* getLayersWindow() {
return new LayersWindow("Qt");
}
virtual Window* getMainWindow() {
return new MainWindow("Qt");
}
virtual void deleteWindow(Window* a) {
delete a;
}
};
#endif

LN : Eden Polymorphic And OOP Design Pattern Abstract Factory的更多相关文章

  1. Design Pattern ->Abstract Factory

    Layering & Contract Philosophy With additional indirection Abstract Factory //The example code i ...

  2. [design pattern](5) Factory Method

    前言 在前面一章博主介绍了简单工厂模式(Simple Factory),接着上面的章节,今天博主就来介绍下工厂方法模式(Factory Method). 思考题 首先,让我们来思考下面的问题: 在上一 ...

  3. [转]Design Pattern Interview Questions - Part 1

    Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...

  4. 简单工厂设计模式(Simple Factory Design Pattern)

    [引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...

  5. Design Pattern ——Factory Method&Abstract Factory

    今天开始复习设计模式.设计模式相关的资料有很多,概念性的东西就画个图就可以了.把关注点放在例子上,设计模式还是要使用中才有感受. 从Factory Method&Abstract Factor ...

  6. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

  7. java设计模式大全 Design pattern samples in Java(最经典最全的资料)

    java设计模式大全 Design pattern samples in Java(最经典最全的资料) 2015年06月19日 13:10:58 阅读数:11100 Design pattern sa ...

  8. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  9. Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

    Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...

随机推荐

  1. oracle 左右链接

    数据表的连接有: 1.内连接(自然连接): inner只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接 ...

  2. Piggy-Bank(复习完全背包)

    传送门 题目大意: 有一个存钱的储存罐,给你它存满钱之前和之后的重量,和几类硬币的面值和重量. 求装满储钱罐时最小能得到多少钱. 题解:完全背包变形. 因为要求最小 一开始赋值大数. code: #i ...

  3. Linux中进程控制块PCB-------task_struct结构体结构

    Linux中task_struct用来控制管理进程,结构如下: struct task_struct { //说明了该进程是否可以执行,还是可中断等信息 volatile long state; // ...

  4. CS231n 2016 通关 第五、六章 Batch Normalization 作业

    BN层在实际中应用广泛. 上一次总结了使得训练变得简单的方法,比如SGD+momentum RMSProp Adam,BN是另外的方法. cell 1 依旧是初始化设置 cell 2 读取cifar- ...

  5. 解决“System.Data.OracleClient需要Oracle客户端软件8.1.7或更高版本”

    问题描述:远程访问该数据库(客户端同样是Oracle11g)提示“System.Data.OracleClient需要Oracle客户端软件8.1.7或更高版本”. 解决的办法: 1.一定要关闭Win ...

  6. bootstrap的tab中,echarts 图表宽度设为100%之后,会出现图表宽带变为100px的情况。只有第一个正常

    1.原因 echarts官方解释是 Tip: 有时候图表会放在多个标签页里,那些初始隐藏的标签在初始化图表的时候因为获取不到容器的实际高宽,可能会绘制失败,因此在切换到该标签页时需要手动调用resiz ...

  7. SQL Server知识详解

    1.SET NOCOUNT ON的作用: 作用:阻止在结果集中返回显示受T-SQL语句或则usp影响的行计数信息. 语法:SET NOCOUNT {ON | OFF} 详解:当SET ONCOUNT ...

  8. 洛谷 - P2281 - 多项式的加法和乘法 - 大模拟

    题目链接:https://www.luogu.org/problemnew/show/P2281 题目的意思很简单,输入两个系数.指数都是整数,变量都是大写字母的多项式,求他们的加法结果和乘法结果. ...

  9. php 发送邮件(实例)

    html部分 <!DOCTYPE html> <html> <head> <title></title> <script type=& ...

  10. Unity亚洲开发者大会会议简录之技术篇,Profiler的一些参数的意思

    2014Unity亚洲开发者大会会议简录之技术篇 拖公司的福,有幸去了一趟北京参加了一场Unity3D的交流盛宴,在为期两天的时间内,不仅有着技术上收获,也有心灵上的震撼.现在先来说说技术方面的一些比 ...