设计模式笔记之---抽象工厂模式

来源:互联网 发布:c语言湖南大学829 编辑:程序博客网 时间:2024/04/29 10:26

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

       抽象工厂模式最大的好处是便于交换产品系列,由于具体工厂类只在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体的工厂即可使用不同的产品配置。同时,它让具体的创建实例的过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中,从而完全遵循了开发--封闭原则和依赖倒装原则。

UML类图:

                   

抽象工厂模式基本代码如下:

/********************************************************************filename: AbstractFactory.hcreated:2012-09-24author:firehoodpurpose:firehood 学设计模式之---抽象工厂模式*********************************************************************/#pragma once#include <iostream>  using namespace std;  // 抽象产品Aclass AbstractProductA{public:AbstractProductA(void){}virtual ~AbstractProductA(void){}};// 具体产品A1,抽象产品A的第一种实现class ConcreteProductA1:public AbstractProductA{public:ConcreteProductA1(void){  cout<<"生产产品A1"<<endl;  }  virtual ~ConcreteProductA1(void){  cout<<"销毁产品A1"<<endl;  }  };// 具体产品A2,抽象产品A的第二种实现class ConcreteProductA2:public AbstractProductA{public:ConcreteProductA2(void){  cout<<"生产产品A2"<<endl;  }  virtual ~ConcreteProductA2(void){  cout<<"销毁产品A2"<<endl;  }  };// 抽象产品Bclass AbstractProductB{public:AbstractProductB(void){}virtual ~AbstractProductB(void){}};// 具体产品B1,抽象产品B的第一种实现class ConcreteProductB1:public AbstractProductB{public:ConcreteProductB1(void){  cout<<"生产产品B1"<<endl;  }  virtual ~ConcreteProductB1(void){  cout<<"销毁产品B1"<<endl;  }  };// 具体产品B2,抽象产品B的第二种实现class ConcreteProductB2:public AbstractProductB{public:ConcreteProductB2(void){  cout<<"生产产品B2"<<endl;  }  virtual ~ConcreteProductB2(void){  cout<<"销毁产品B2"<<endl;  }  };// 抽象工厂class AbstractFactory{public:AbstractFactory(void){}virtual ~AbstractFactory(void){}virtual AbstractProductA* CreateProductA() = 0;virtual AbstractProductB* CreateProductB() = 0;};// 具体工厂1class ConcreteFactory1:public AbstractFactory{public:ConcreteFactory1(void){  cout<<"创建工厂1"<<endl;  }  virtual ~ConcreteFactory1(void){  cout<<"销毁工厂1"<<endl;  }  virtual AbstractProductA* CreateProductA(){// 创建产品A1return new ConcreteProductA1();}virtual AbstractProductB* CreateProductB(){// 创建产品B1return new ConcreteProductB1();}};// 具体工厂2class ConcreteFactory2:public AbstractFactory{public:ConcreteFactory2(void){  cout<<"创建工厂2"<<endl;  }  virtual ~ConcreteFactory2(void){  cout<<"销毁工厂2"<<endl;  }  virtual AbstractProductA* CreateProductA(){// 创建产品A2return new ConcreteProductA2();}virtual AbstractProductB* CreateProductB(){// 创建产品B2return new ConcreteProductB2();}};
客户端调用代码如下:

#include "AbstractFactory.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){cout<<"*************************************"<<endl;cout<<"firehood 学设计模式之---抽象工厂模式"<<endl;cout<<"*************************************"<<endl;    AbstractFactory *factory = new ConcreteFactory1();//AbstractFactory *factory = new ConcreteFactory2();    AbstractProductA *productA = factory->CreateProductA();AbstractProductB *productB = factory->CreateProductB();delete productA;delete productB;delete factory;    system("pause");return 0;}
运行结果如下:

*************************************
firehood 学设计模式之---抽象工厂模式
*************************************
创建工厂1
生产产品A1
生产产品B1
销毁产品A1
销毁产品B1
销毁工厂1
请按任意键继续. . .