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. jquery Mobile弹出窗

    先创建一个窗体 <div data-role="popup" id="popupView" class="ui-content" da ...

  2. centos lamp

    一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...

  3. HDU 4352 XHXJ's LIS

    奇妙的题. 你先得会另外一个nlogn的LIS算法.(我一直只会BIT.....) 然后维护下每个数码作为结尾出现过没有就完了. #include<iostream> #include&l ...

  4. 如何把TOMCAT 添加到服务中自动启动

    1.配置系统参数: JAVA_HOME:C:\Program Files\Java\jdk1.8.0_51   //本机Jdk的安装路径,已配置相关Java应用的无需再配置. CATALINA_HOM ...

  5. iOS内部跳转问题

    //打开地图       NSString*addressText = @" "; //@"1Infinite Loop, Cupertino, CA 95014&quo ...

  6. E - 滑雪

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Pract ...

  7. ThinkPHP整合微信支付之发裂变红包

    1.去商户平台里,给你的商户充钱,没钱是发不了红包哒! 2.微信红包需要证书支持,所以请大家到商户平台下去下载好证书后放到安全文件夹下,并且需要在配置文件中指定好证书路径! 好,接下来带来裂变红包具体 ...

  8. Hibernate一对多 特殊的数据类型的注解

    1.String 类型 @ElementCollection(targetClass = String.class,fetch = FetchType.EAGER) @CollectionTable( ...

  9. poj3160 强连通+记忆化搜索

    题意:有一张 n 点 m 边的有向无环图,每个点有各自的权值,可正可负,现在从一个点开始走,一直走到不能走到其他点为止,每经过一个点,可以选择获得或不获得它的权值,每个点可以走多次,但是权值只能获得一 ...

  10. 论文笔记之:Speed Up Tracking by Ignoring Features

    Speed Up Tracking by Ignoring Features CVPR 2014 Abstract:本文提出一种特征选择的算法,来实现用最"精简"的特征以进行目标跟 ...