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. vertical-align及IE7下的inline-block

    在IE7下,是不支持inline-block元素的,当对块级元素如dl进行inline-block样式设置时,在IE7浏览器是下样式是不会生效的. 若要在IE7下实现将块级元素设置为内联元素,可以这样 ...

  2. wp8.1 Study19:通知

    一.通知形式 在windowsphone系统中,通知有很多中形式,如下图 (Tile磁贴在前一博文已复习过,Badge形式与tile类似) 1.Toast 它主要是利用xml文件来编写的,xml代码如 ...

  3. 关闭缓存和mmu(转)

    当设置完时钟分频以后,uboot就会执行cpu_init_crit汇编函数,这个函数的主要作用就是关闭缓存和mmu,然后调用lowlevel_init函数进行系统总线的初始化. 为什么启动的时候,需要 ...

  4. Hadoop学习资料

    转自:http://cloud21.iteye.com/blog/607175 第一手资源 hadoop官方网站 hadoop.apache.org 最权威的官方资源之一 dev.yahoo.hado ...

  5. 帐户当前被锁定,所以用户 sa 登录失败。系统管理员无法将该帐户解锁 解决方法

    ALTER LOGIN sa ENABLE ; GO ALTER LOGIN sa WITH PASSWORD = 'password' unlock, check_policy = off, che ...

  6. Matcher.group

    Exception in thread "main" java.lang.IllegalStateException: No match found at java.util.re ...

  7. HttpContext.Current.Cache 和HttpRuntime.Cache的区别

    先看MSDN上的解释:      HttpContext.Current.Cache:为当前 HTTP 请求获取Cache对象.      HttpRuntime.Cache:获取当前应用程序的Cac ...

  8. 防止apache下面直接输入目录访问文件

    有些项目链接会暴露服务器上面的文件地址,如何访问文件被访问呢 方法一: 在项目入口文件下面新加一个.htaccess文件(apache开启重写模式才会加载这个文件,否则这个文件配置不会生效) 文件中加 ...

  9. C#基础知识系列十(集合)

    前言 本节主要是来了解学习集合,以方便在程序编写时,什么地方该选用什么集合,让程序更健壮的运行起来.在学习了解集合之前,首先需要了解一些数据结构方面的知识.下面我们就先简单的来看一下数据结构. 数据结 ...

  10. Sublime Text 2 配置

    设置Python的Tab缩进为四个空格,打开一个Py文件 # Preferences---->Settings-More---->Syntax Specific-User # 贴入如下代码 ...