AbstractFactory模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。

  AbstractFactory模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteFactory)中,

维护这样一个创建类总比维护n多相关对象的创建过程要简单的多。

Product.h

 #ifndef _PRODUCT_H_
#define _PRODUCT_H_
class AbstractProductA {
public:
virtual ~AbstractProductA();
protected:
AbstractProductA();
private:
};
class AbstractProductB {
public:
virtual ~AbstractProductB();
protected:
AbstractProductB();
private:
};
class ProductA1:public AbstractProductA {
public:
ProductA1();
~ProductA1();
protected:
private:
};
class ProductA2:public AbstractProductA {
public:
ProductA2();
~ProductA2();
protected:
private:
};
class ProductB1:public AbstractProductB {
public:
ProductB1();
~ProductB1();
protected:
private:
};
class ProductB2:public AbstractProductB {
public:
ProductB2();
~ProductB2();
protected:
private:
};
#endif //~_PRODUCT_H_

Product.cpp

 #include "Product.h"
#include <iostream>
using namespace std;
AbstractProductA::AbstractProductA() {
}
AbstractProductA::~AbstractProductA() {
}
AbstractProductB::AbstractProductB() {
}
AbstractProductB::~AbstractProductB() {
}
ProductA1::ProductA1() {
cout<<"ProductA1..."<<endl; }
ProductA1::~ProductA1() {
}
ProductA2::ProductA2() {
cout<<"ProductA2..."<<endl; }
ProductA2::~ProductA2() {
}
ProductB1::ProductB1(){
cout<<"ProductB1..."<<endl; }
ProductB1::~ProductB1() {
}
ProductB2::ProductB2() {
cout<<"ProductB2..."<<endl; }
ProductB2::~ProductB2() {
}

AbstractFactory.h

 #ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_ class AbstractProductA;
class AbstractProductB; class AbstractFactory {
public:
virtual ~AbstractFactory();
virtual AbstractProductA* CreateProductA() = ;
virtual AbstractProductB* CreateProductB() = ;
protected:
AbstractFactory();
private:
};
class ConcreteFactory1:public AbstractFactory {
public:
ConcreteFactory1();
~ConcreteFactory1();
AbstractProductA* CreateProductA();
AbstractProductB* CreateProductB();
protected:
private:
};
class ConcreteFactory2:public AbstractFactory {
public:
ConcreteFactory2();
~ConcreteFactory2();
AbstractProductA* CreateProductA();
AbstractProductB* CreateProductB();
protected:
private:
};
#endif //~_ABSTRACTFACTORY_H_

AbstractFactory.cpp

 #include "AbstractFactory.h"
#include "Product.h"
#include <iostream>
using namespace std;
AbstractFactory::AbstractFactory() {
}
AbstractFactory::~AbstractFactory()
{
}
ConcreteFactory1::ConcreteFactory1() {
}
ConcreteFactory1::~ConcreteFactory1() {
}
AbstractProductA* ConcreteFactory1::CreateProductA() { return new ProductA1(); }
AbstractProductB* ConcreteFactory1::CreateProductB() { return new ProductB1(); }
ConcreteFactory2::ConcreteFactory2() {
}
ConcreteFactory2::~ConcreteFactory2() {
}
AbstractProductA* ConcreteFactory2::CreateProductA() { return new ProductA2(); }
AbstractProductB* ConcreteFactory2::CreateProductB() { return new ProductB2(); }

main.cpp

 #include "AbstractFactory.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[]) {
AbstractFactory* cf1 = new ConcreteFactory1();
cf1->CreateProductA();
cf1->CreateProductB();
AbstractFactory* cf2 = new ConcreteFactory2();
cf2->CreateProductA();
cf2->CreateProductB();
return ;
}

  AbstractFactory模式和Factory模式的区别是初学(使用)设计模式时候的一个容易引起困惑的地方。实际上,AbstractFactory模式是为创建一组(有多类)相关或依赖的对象提供创建接口,而Factory模式正如我在相应的文档中分析的是为一类对象提供创建接口或延迟对象的创建到子类中实现。并且可以看到,AbstractFactory模式通常都是使用Factory模式实现(ConcreteFactory1)。

AbstactFactory模式的更多相关文章

  1. 设计模式之工厂模式(Factory模式)

    在面向对象系统设计中经常遇到以下两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口.这样我们可以通过声明一个指向基类的 ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  4. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

  5. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  6. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  7. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  8. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  9. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

随机推荐

  1. day4_python-之装饰器、迭代器、生成器

    一.装饰器 1.为何要用装饰器 #开放封闭原则:对修改封闭,对扩展开放 2. 什么是装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被 ...

  2. Oracle安装 卸载 和常见问题

    Oracle的安装   全局数据库名:orcl  口令:orcl 或者以第三方工具SQLplus为例 系统用户:sys 和 system  练习账户:scott (密码:tiger) 登录账户为:sy ...

  3. Java练习 SDUT-1117_求绝对值(选择结构)

    C语言实验--求绝对值(选择结构) Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 从键盘上输入任意一个整数,然后输出它 ...

  4. hibernate 出现Caused by: java.sql.SQLException: Column 'id' not found.异常

    用hibernate进行映射查询时,出现Caused by: java.sql.SQLException: Column 'id' not found 异常,检查数据库表及映射都有id且已经正确映射, ...

  5. Spring Security入门篇——标签sec:authorize的使用

    Security框架可以精确控制页面的一个按钮.链接,它在页面上权限的控制实际上是通过它提供的标签来做到的 Security共有三类标签authorize authentication accessc ...

  6. 2018-2-13-windows-10预览版升级win10-7月29-10240.16384

    title author date CreateTime categories windows 10预览版升级win10 7月29 10240.16384 lindexi 2018-2-13 17:2 ...

  7. oracle函数 TRANSLATE(c1,c2,c3)

    [功能]将字符表达式值中,指定字符替换为新字符 [说明]多字节符(汉字.全角符等),按1个字符计算 [参数] c1   希望被替换的字符或变量 c2   查询原始的字符集 c3   替换新的字符集,将 ...

  8. oracle函数 SOUNDEX(c1)

    [功能]返回字符串参数的语音表示形式 [参数]c1,字符型 [返回]字符串 [说明]相对于比较一些读音相同,但是拼写不同的单词是非常有用的. 计算语音的算法: 1.保留字符串首字母,但删除a.e.h. ...

  9. laravel5.6 QQ 第三方登录

    https://socialiteproviders.github.io/providers/qq.html 1. Installation // This assumes that you have ...

  10. 远程监控JVM

    设置tomcat中catalina.sh设置JAVA_OPTS= JAVA_OPTS="-server -Xms595M -Xmx595M -Xmn223M -XX:SurvivorRati ...