C++设计模式-AbstractFactory抽象工厂模式
来源:互联网 发布:java sql注入漏洞修复 编辑:程序博客网 时间:2024/05/30 22:51
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
1 #ifndef _PRODUCT_H_ 2 #define _PRODUCT_H_ 3 4 //抽象基类AbstractProductA,代表A类产品的抽象 5 class AbstractProductA 6 { 7 public: 8 virtual ~AbstractProductA()=0; 9 virtual void operation()=0;10 protected:11 AbstractProductA();//屏蔽构造函数12 };13 14 //派生类ProductA1,继承自AbstractProductA,A类产品的一种实现15 class ProductA1 : public AbstractProductA16 {17 public:18 ProductA1();19 virtual void operation();20 virtual ~ProductA1();21 };22 23 //派生类ProductA2,继承自AbstractProductA,A类产品的另一种实现24 class ProductA2:public AbstractProductA25 {26 public:27 ProductA2();28 virtual void operation();29 virtual ~ProductA2();30 };31 32 //抽象基类AbstractProductB,代表B类产品的抽象33 class AbstractProductB34 {35 public:36 virtual ~AbstractProductB()=0;37 virtual void operation()=0;38 protected:39 AbstractProductB();//屏蔽构造函数40 };41 42 //派生类ProductB1,继承自AbstractProductB,B类产品的一种实现43 class ProductB1:public AbstractProductB44 {45 public:46 ProductB1();47 virtual void operation();48 virtual ~ProductB1();49 };50 51 //派生类ProductB2,继承自AbstractProductB,B类产品的另一种实现52 class ProductB2:public AbstractProductB53 {54 public:55 ProductB2();56 virtual void operation();57 virtual ~ProductB2();58 };59 60 61 #endif
Factory.h
1 #ifndef _FACTORY_H_ 2 #define _FACTORY_H_ 3 4 //AbstractFactory,工厂抽象基类,定义生产A类与B类产品的接口 5 class AbstractProductA; 6 class AbstractProductB; 7 class AbstractFactory 8 { 9 public:10 virtual ~AbstractFactory()=0;11 virtual AbstractProductA* CreateProductA()=0;12 virtual AbstractProductB* CreateProductB()=0;13 protected:14 AbstractFactory();15 };16 17 //ConcreteFactory1,派生类,继承自AbstractFactory18 //实现继承的接口,生产产品A和B的一种实现19 class ConcreteFactory1:public AbstractFactory20 {21 public:22 ConcreteFactory1();23 ~ConcreteFactory1();24 virtual AbstractProductA* CreateProductA();25 virtual AbstractProductB* CreateProductB();26 };27 28 //ConcreteFactory2,派生类,继承自AbstractFactory29 //实现继承的接口,生产产品A和B的另一种实现30 class ConcreteFactory2:public AbstractFactory31 {32 public:33 ConcreteFactory2();34 ~ConcreteFactory2();35 virtual AbstractProductA* CreateProductA();36 virtual AbstractProductB* CreateProductB();37 };38 39 #endif
Product.cpp
1 #include "Product.h" 2 #include <iostream> 3 4 using namespace std; 5 6 //AbstractProductA 7 AbstractProductA::AbstractProductA() 8 { 9 cout << "AbstractProductA..." << endl;10 }11 12 AbstractProductA::~AbstractProductA()13 {14 cout << "~AbstractProductA..." << endl;15 }16 17 //ProductA118 ProductA1::ProductA1()19 {20 cout << "ProductA1..." << endl;21 }22 23 ProductA1::~ProductA1()24 {25 cout << "~ProductA1..." << endl;26 }27 28 void ProductA1::operation()29 {}30 31 //ProductA232 ProductA2::ProductA2()33 {34 cout << "ProductA2..." << endl;35 }36 37 ProductA2::~ProductA2()38 {39 cout << "~ProductA2..." << endl;40 }41 42 void ProductA2::operation()43 {}44 45 //AbstractProductB46 AbstractProductB::AbstractProductB()47 {48 cout << "AbstractProductB..." << endl;49 }50 51 AbstractProductB::~AbstractProductB()52 {53 cout << "~AbstractProductB..." << endl;54 }55 56 //ProductB157 ProductB1::ProductB1()58 {59 cout << "ProductB1..." << endl;60 }61 62 ProductB1::~ProductB1()63 {64 cout << "~ProductB1..." << endl;65 }66 67 void ProductB1::operation()68 {}69 70 //ProductB271 ProductB2::ProductB2()72 {73 cout << "ProductB2..." << endl;74 }75 76 ProductB2::~ProductB2()77 {78 cout << "~ProductB2..." << endl;79 }80 81 void ProductB2::operation()82 {}
Factory.cpp
1 #include "Factory.h" 2 #include "Product.h" 3 #include <iostream> 4 5 using namespace std; 6 7 AbstractFactory::AbstractFactory() 8 { 9 cout << "AbstractFactory..." << endl;10 }11 12 AbstractFactory::~AbstractFactory()13 {14 cout << "~AbstractFactory..." << endl;15 }16 17 ConcreteFactory1::ConcreteFactory1()18 {19 cout << "ConcreteFactory1..." << endl;20 }21 22 ConcreteFactory1::~ConcreteFactory1()23 {24 cout << "~ConcreteFactory1..." << endl;25 }26 27 AbstractProductA* ConcreteFactory1::CreateProductA()28 {29 return new ProductA1();30 }31 32 AbstractProductB* ConcreteFactory1::CreateProductB()33 {34 return new ProductB1();35 }36 37 ConcreteFactory2::ConcreteFactory2()38 {39 cout << "ConcreteFactory2..." << endl;40 }41 42 ConcreteFactory2::~ConcreteFactory2()43 {44 cout << "~ConcreteFactory2..." << endl;45 }46 47 AbstractProductA* ConcreteFactory2::CreateProductA()48 {49 return new ProductA2();50 }51 52 AbstractProductB* ConcreteFactory2::CreateProductB()53 {54 return new ProductB2();55 }
main.cpp
1 #include <iostream> 2 #include "Factory.h" 3 #include "Product.h" 4 5 using namespace std; 6 7 int main() 8 { 9 AbstractFactory* fa1 = new ConcreteFactory1();10 AbstractProductA* a1 = fa1->CreateProductA();11 AbstractProductB* b1 = fa1->CreateProductB();12 13 cout << endl;14 AbstractFactory* fa2 = new ConcreteFactory2();15 AbstractProductA* a2 = fa2->CreateProductA();16 AbstractProductB* b2 = fa2->CreateProductB();17 18 cout << endl;19 delete fa1;20 delete a1;21 delete b1;22 23 cout << endl;24 delete fa2;25 delete a2;26 delete b2;27 28 return 0;29 }
阅读全文
1 0
- 设计模式--抽象工厂(AbstractFactory)
- 设计模式 - AbstractFactory抽象工厂
- 设计模式的实现(C++)------抽象工厂模式(AbstractFactory)
- [设计模式]AbstractFactory抽象工厂模式
- 设计模式 -- 抽象工厂模式 AbstractFactory
- 设计模式之抽象工厂模式(AbstractFactory)
- C++设计模式-AbstractFactory抽象工厂模式
- C++设计模式-AbstractFactory抽象工厂模式
- 【设计模式】-抽象工厂模式-AbstractFactory
- C++设计模式-AbstractFactory抽象工厂模式
- 设计模式 — 抽象工厂模式 (AbstractFactory)
- 设计模式-抽象工厂模式-abstractfactory-python
- C++设计模式-AbstractFactory抽象工厂模式
- AbstractFactory抽象工厂模式
- AbstractFactory抽象工厂模式
- AbstractFactory抽象工厂模式
- 抽象工厂模式 AbstractFactory
- C#设计模式之抽象工厂(AbstractFactory)
- Java中内部类--静态和非静态
- vue开源项目库汇总
- 【Hbase】初识Hbase,单节点安装
- Unity Shader 网站收集
- CentOS搭建git服务器(亲测)
- C++设计模式-AbstractFactory抽象工厂模式
- 支付系统中的对账处理
- My Redis Note
- 关于Java并发编程的总结和思考
- Android 平台的 10 款开源任务管理和时间追踪应用
- C++设计模式-Singleton
- 算法导论 学习笔记 第六章 堆排序
- spice协议详解(一):spice协议入门
- Android短信自动添加功能