纠结了好几天,总算是搞懂了点抽象工厂和工厂方法模式的一些区别了。
两篇很好的文章:
http://blog.csdn.net/superbeck/article/details/4446177
http://blog.csdn.net/wyxhd2008/article/details/5597975
抽象工厂其实跟工厂方法模式差不多,都遵循开放--封闭原则,使用工厂接口创建派生工厂,进而创建相应对象。但是抽象工厂更加深层,即一个工厂可以创建一系列的产品,而工厂方法模式一般是一个工厂只创建一个产品。换句话说,抽象工厂是一个产品线,可以生产一系列产品,而每个产品线都能生产各种产品,只是有相应的属性不同。我们在扩展的时候,扩展的是一条产品线。而工厂方法模式中,我们扩展的是一种产品,简单工厂由于有switch case等判定条件,不利于扩展,但是比较简单。
定义:
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
一个例子:
// 设计模式Demo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
/*
以游戏引擎U3D UE以及图形库 D3D,OpenGL为例
两个引擎,底层调用可以是D3D或OpenGL,虽然都有两种产品,但是产品族不同。
使用抽象工厂模式
*/
//图形库基类
class Graphic
{
public :
virtual void draw() = 0;
};
//D3D图形库
class D3D : public Graphic
{
public:
void draw() override
{
cout<<"D3D draw!"<<endl;
}
};
//OpenGL图形库
class OpenGL : public Graphic
{
void draw() override
{
cout<<"OpenGL draw!"<<endl;
}
};
//引擎基类
class Engine
{
public:
virtual Graphic* useD3D() = 0;
virtual Graphic* useOpenGL() = 0;
};
//U3D引擎
class U3DEngine : public Engine
{
public:
//D3D产品(使用D3D图形库)
D3D* useD3D() override
{
cout<<"U3DEngine use D3D!"<<endl;
return new D3D();
}
//OpenGL产品(使用OpenGL图形库)
OpenGL* useOpenGL() override
{
cout<<"U3DEngine use OpenGL!"<<endl;
return new OpenGL();
}
};
//UE引擎
class UEEngine : public Engine
{
public:
//D3D产品(使用D3D图形库)
D3D* useD3D() override
{
cout<<"UEEngine use D3D!"<<endl;
return new D3D();
}
//OpenGL产品(使用OpenGL图形库)
OpenGL* useOpenGL() override
{
cout<<"UEEngine use OpenGL!"<<endl;
return new OpenGL();
}
};
//客户端
int _tmain(int argc, _TCHAR* argv[])
{
//创建一个抽象工厂(实例化U3D工厂)
Engine* engine = new U3DEngine();
//两种产品
engine->useD3D()->draw();
engine->useOpenGL()->draw();
//实例化UE工厂
engine = new UEEngine();
//两种产品
engine->useD3D()->draw();
engine->useOpenGL()->draw();
getchar();
return 0;
}
结果:
U3DEngine use D3D!
D3D draw!
U3DEngine use OpenGL!
OpenGL draw!
UEEngine use D3D!
D3D draw!
UEEngine use OpenGL!
OpenGL draw!
关于工厂方法模式和抽象工厂模式的区别:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。