C++设计模式-AbstractFactory抽象工厂模式
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抽象工厂模式的更多相关文章
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- AbstractFactory(抽象工厂模式)
AbstractFactory(抽象工厂模式) 有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象 <?php class Config { publi ...
- C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】
一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...
- C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】
一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简 ...
- 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型
1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...
- 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- C#设计模式(4)-抽象工厂模式
引言 上一篇介绍了设计模式中的简单工厂模式-C#设计模式(3)-工厂方法模式,本篇将介绍抽象工厂模式: 抽象工厂模式简介 抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依 ...
随机推荐
- 局域网单机部署双tomcat内外网不能访问防火墙问题查出来
tomcat部署的项目内网访问不了 win7 64 位 控制面板 - 安全 -防火墙-入站规则- 新建规则 选中“端口”按钮,点选“下一步”: 选择“TCP”按钮,在“特定本地端口”输入tomcat ...
- Sae上传war包找不到编译文件
最近在试新浪的sae平台,有个问题困扰了几天,现在想来还是自己对JAVA的理解不深入,这里写下仅作记忆. 问题:在整微信公众号平台进开发者中心的时候,token验证一直是失败的.但是项目在本地的环境中 ...
- DIV+CSS
1.可以引入外部的样式:<link rel="stylesheet" type="text/css" href="外部的CSS文件路径&q ...
- JVM-字节码执行引擎
虚拟机字节码执行引擎 一.运行时栈帧结构 1.栈帧(Stack Frame)是用于支持虚拟机进行调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Method Stack) ...
- rails常用验证方法 (转)
validates_presence_of :login, :message => "用户名不能为空!" validates_length_of ...
- JavaScript基础--小案例:在网页指定位置弹出错误信息(十二)
案例分析:点击按钮后,在网页上指定区域,提示错误信息!5秒后,错误信息提示自动消失! <script languag="javascript" type="text ...
- [深入Python]sys.modules
Python中所有加载到内存的模块都放在sys.modules.当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用import的模块的Loc ...
- Linq学习总结1--参考Linq技术详解
2个要点: 1.linq操作的集合必须实现IEnumerable接口,所以在这3.0之前为实现该接口的集合需通过Cast或TypeOf方法转换成可Linq的集合; 2.查询式和Lame那啥表达式都可以 ...
- 修改mysql用户名密码 和 PHPmysqlAdmin对应密码修改
本地的mysql运行时,可能会用到修改用户名密码: mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('输入新密码');不存在修改用户啊 ...
- centos7 查询jdk安装路径