AbstractFactory

要创建一组相关或者相互依赖的对象

作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

UML结构图:

抽象基类

1)AbstractProductA、AbstractProductB:分别代表两种不同类型的产品,由具体的产品派生类对其实现

2)AbstractFactory:抽象工厂类,提供创建两种产品的接口CreateProductA和CreateProductB,由派生的各个具体工厂类对其实现

说明:

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

Abstract Factory模式和Factory最大的差别就是抽象工厂创建的是一系列相关的对象,其中创建的实现其实采用的就是Factory模式的方法,对于某个实现的有一个派生出来的抽象工厂,另一个实现有另一个派生出来的工厂

抽象工厂需要特别注意的地方就是区分不同类型的产品和这些产品的不同实现.显而易见的,如果有n种产品同时有m中不同的实现,那么根据乘法原理可知有n*m个Factory模式的使用

AbstractFactory模式是为创建一组(有多类)相关或依赖的对象提供创建接口,而Factory模式是为一类对象提供创建接口或延迟对象的创建到子类中实现。并且可以看到,AbstractFactory模式通常都是使用Factory模式实现(ConcreteFactory1)。

代码如下

Product.h

 #ifndef _PRODUCT_H_
#define _PRODUCT_H_ //抽象基类AbstractProductA,代表A类产品的抽象
class AbstractProductA
{
public:
virtual ~AbstractProductA()=;
virtual void operation()=;
protected:
AbstractProductA();//屏蔽构造函数
}; //派生类ProductA1,继承自AbstractProductA,A类产品的一种实现
class ProductA1 : public AbstractProductA
{
public:
ProductA1();
virtual void operation();
virtual ~ProductA1();
}; //派生类ProductA2,继承自AbstractProductA,A类产品的另一种实现
class ProductA2:public AbstractProductA
{
public:
ProductA2();
virtual void operation();
virtual ~ProductA2();
}; //抽象基类AbstractProductB,代表B类产品的抽象
class AbstractProductB
{
public:
virtual ~AbstractProductB()=;
virtual void operation()=;
protected:
AbstractProductB();//屏蔽构造函数
}; //派生类ProductB1,继承自AbstractProductB,B类产品的一种实现
class ProductB1:public AbstractProductB
{
public:
ProductB1();
virtual void operation();
virtual ~ProductB1();
}; //派生类ProductB2,继承自AbstractProductB,B类产品的另一种实现
class ProductB2:public AbstractProductB
{
public:
ProductB2();
virtual void operation();
virtual ~ProductB2();
}; #endif

Factory.h

 #ifndef _FACTORY_H_
#define _FACTORY_H_ //AbstractFactory,工厂抽象基类,定义生产A类与B类产品的接口
class AbstractProductA;
class AbstractProductB;
class AbstractFactory
{
public:
virtual ~AbstractFactory()=;
virtual AbstractProductA* CreateProductA()=;
virtual AbstractProductB* CreateProductB()=;
protected:
AbstractFactory();
}; //ConcreteFactory1,派生类,继承自AbstractFactory
//实现继承的接口,生产产品A和B的一种实现
class ConcreteFactory1:public AbstractFactory
{
public:
ConcreteFactory1();
~ConcreteFactory1();
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
}; //ConcreteFactory2,派生类,继承自AbstractFactory
//实现继承的接口,生产产品A和B的另一种实现
class ConcreteFactory2:public AbstractFactory
{
public:
ConcreteFactory2();
~ConcreteFactory2();
virtual AbstractProductA* CreateProductA();
virtual AbstractProductB* CreateProductB();
}; #endif

Product.cpp

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

Factory.cpp

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

main.cpp

 #include <iostream>
#include "Factory.h"
#include "Product.h" using namespace std; int main()
{
AbstractFactory* fa1 = new ConcreteFactory1();
AbstractProductA* a1 = fa1->CreateProductA();
AbstractProductB* b1 = fa1->CreateProductB(); cout << endl;
AbstractFactory* fa2 = new ConcreteFactory2();
AbstractProductA* a2 = fa2->CreateProductA();
AbstractProductB* b2 = fa2->CreateProductB(); cout << endl;
delete fa1;
delete a1;
delete b1; cout << endl;
delete fa2;
delete a2;
delete b2; return ;
}

C++设计模式-AbstractFactory抽象工厂模式的更多相关文章

  1. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  2. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  3. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  4. AbstractFactory(抽象工厂模式)

    AbstractFactory(抽象工厂模式) 有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象 <?php class Config { publi ...

  5. C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】

    一.引言     写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...

  6. C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】

    一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简 ...

  7. 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型

    1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...

  8. 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  9. C#设计模式(4)-抽象工厂模式

    引言 上一篇介绍了设计模式中的简单工厂模式-C#设计模式(3)-工厂方法模式,本篇将介绍抽象工厂模式: 抽象工厂模式简介 抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依 ...

随机推荐

  1. linux shell 指令 诸如-d, -f, -e之类的判断表达式

    文件比较运算符-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]-d filename 如果 filename为目录,则为真 [ -d /tmp/ ...

  2. 系统不支持curl

    解决安装pinphp时出现的“系统不支持curl!”   今天在本机安装phppin开源程序时,提示“系统不支持curl!”错误. 由于我本机是UBUNTU系统,所以直接通过apt-get进行安装. ...

  3. PATH变量

    PATH变量由系统管理员配置,通常包含如下一些存储系统程序的标准路径: /bin  二进制文件目录,用于存放启动系统时用到的路径 /usr/bin  用户二进制文件目录,用于存放用户使用的标准程序 / ...

  4. apache2服务器mod_rewrite模块 开启方法[linux, ubuntu]

    在UBUNTU系统中要启用mod_rewrite的方法有两种: 第一种: 在终端中执行 sudo a2enmod rewrite 指 令后,即启用了 Mod_rewrite 模块, apache2服务 ...

  5. ubuntu14.04 键盘错位小问题

    分享一个ubuntu14.04里的小问题,不知道有没有人跟我一样悲催 问题: 键盘错位了,@和"两个符合正好颠倒,~#这几个也错乱了,~符号跑到了|上,#跑到了shift+|上,这个问题在敲 ...

  6. Linux中查看文件编码

    在Linux中查看文件编码可以通过以下几种方式:1.在Vim中可以直接查看文件编码:set fileencoding即可显示文件编码格式.如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱 ...

  7. 第三个Sprint冲刺第六天

    讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:研究一下有趣的东西

  8. pytho day6 <正则表达式、常用模块、反射>

    本节介绍: 一:正则表达式: 正则表达并不是python 独有的.在各个语言里都有该语法的介绍.正则表达是处理字符串的强大的处理工具.拥有自己的独特的 处理方法.和处理引擎.虽然性能没有python ...

  9. nat转换

    实验目的: (1)     了解nat转换 (2)     了解nat转换配置命令 (3)     了解哪些是私有ip地址哪些不是私有ip地址 实验工具: 华为eNSP模拟器和Wireshar 实验拓 ...

  10. jsp状态管理

    http无状态协议 服务器记不住你 每次浏览器访问,服务器不会特点保存相应信息,故记不住你 jsp状态存储的两种机制 cookie 存储在客户端 用途: 1.简化登陆 2.追踪特定对象 3.保存用户常 ...