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. SpringMVC进阶

    1.springmvc(注解版本) 注解扫描 <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  2. NOIP 2015 BZOJ 4326 运输计划 (树链剖分+二分)

    Description 公元 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− 条双向航道,每条航道建立在两个星球之间,这 n− 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司, ...

  3. CodeForces 686C-Robbers' watch

    题意: 一个电子手表的示数是7进制的,现在告诉你一天有多少小时和一小时有多少分钟,问你一天里有多少个时刻,这个表上显示的数字各不相同. 分析: 先找出表上有多少位数字,再按位dfs,看最后得到的数是否 ...

  4. python mysql 更新和插入数据无效

    注意,在删除和增加后必须执行conn.commit()才有效,否则操作无效.

  5. 需要使用id内省方法--responsesToSelector: 的两个地方

    第一个: 当从数组中取出对象,并且需要执行某个方法时,最好使用responsesToSelector:判断该对象是否可以 执行该方法.因为在OC数组中,取出的对象都是 id 类型的. 第二个: 在MV ...

  6. JVM-程序编译与代码晚期(运行期)优化

    晚期(运行期)优化 1.为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time,JI ...

  7. 开发者如何利用工具快速开发出完美APP

    文|移动互联网李建华 微信:ydhlwdyq 传统的个人开发者,要想开发出一个完美的APP要 经过以下几个过程:搭建开发环境,写代码,写统计系统,开发即将完成后,要购买服务器,然后把程序布置到服务器上 ...

  8. jquery操作select(增加,删除,清空)

    jQuery获取Select选择的Text和Value: $("#select_id").change(function(){//code...}); //为Select添加事件, ...

  9. [转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程

    一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http ...

  10. 不让padding影响元素的宽度

    CSS3 新增了 box-sizing 属性. 以前,如果指定 div 的宽度为 div { width: 100px; height: 100px; padding: 10px; } 则包含 pad ...