工厂方法(FactoryMethod)模式:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
工厂方法模式的主要角色如下:
抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
例子:比如手机,有苹果、小米手机。那么就对应苹果手机厂,小米手机厂家。
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef enum
{
IPhone,
Mi
}Data_Type;
class CPhoneManager
{
public:
CPhoneManager(){};
virtual ~CPhoneManager()
{
}
virtual void Service()
{
return;
}
};
class CIPhoneManager:public CPhoneManager
{
public:
CIPhoneManager()
{
}
~CIPhoneManager()
{
}
virtual void Service()
{
cout<<"苹果手机"<<endl;
}
};
class CMiManager:public CPhoneManager
{
public:
CMiManager()
{
}
virtual ~CMiManager()
{
}
virtual void Service()
{
cout<<"小米手机"<<endl;
}
};
class Factory
{
public:
virtual CPhoneManager* Create()
{
return NULL;
}
};
class CIPhoneFactory : public Factory
{
CPhoneManager* Create()
{
return new CIPhoneManager();
}
};
class CMiFactory : public Factory
{
CMiManager* Create()
{
return new CMiManager();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Factory* pFactroy = new Factory();
CPhoneManager* pPhoneManager = new CPhoneManager();
//生产苹果手机
pFactroy = new CIPhoneFactory();
pPhoneManager = pFactroy->Create();
pPhoneManager->Service();
//生产小米手机
pFactroy = new CMiFactory();
pPhoneManager = pFactroy->Create();
pPhoneManager->Service();
delete pPhoneManager;
delete pFactroy;
system("pause");
return 0;
}
工厂方法模式的主要优点有:
用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
其缺点是:每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度