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 }
复制代码
原创粉丝点击