抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式最大的好处是便于交换产品系列,由于具体工厂类只在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体的工厂即可使用不同的产品配置。同时,它让具体的创建实例的过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中,从而完全遵循了开发--封闭原则和依赖倒装原则。
UML类图:
抽象工厂模式基本代码如下:
/********************************************************************
filename: AbstractFactory.h
created: 2012-09-24
author: firehood
purpose: firehood 学设计模式之---抽象工厂模式
*********************************************************************/
#pragma once
#include <iostream>
using namespace std;
// 抽象产品A
class 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;
}
};
// 抽象产品B
class 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;
};
// 具体工厂1
class ConcreteFactory1:public AbstractFactory
{
public:
ConcreteFactory1(void)
{
cout<<"创建工厂1"<<endl;
}
virtual ~ConcreteFactory1(void)
{
cout<<"销毁工厂1"<<endl;
}
virtual AbstractProductA* CreateProductA()
{
// 创建产品A1
return new ConcreteProductA1();
}
virtual AbstractProductB* CreateProductB()
{
// 创建产品B1
return new ConcreteProductB1();
}
};
// 具体工厂2
class ConcreteFactory2:public AbstractFactory
{
public:
ConcreteFactory2(void)
{
cout<<"创建工厂2"<<endl;
}
virtual ~ConcreteFactory2(void)
{
cout<<"销毁工厂2"<<endl;
}
virtual AbstractProductA* CreateProductA()
{
// 创建产品A2
return new ConcreteProductA2();
}
virtual AbstractProductB* CreateProductB()
{
// 创建产品B2
return 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
请按任意键继续. . .