简单工厂模式
核心思想是用一个工厂来根据输入的条件产生不同的类,(返回父类接口或抽象类接口)。
其次利用多态原理,将实现类(继承于抽象接口)各自进行自己的实现。这样的话,在实现类中是一个高内聚的类,类与类之间没有任何关系。
优点:
1、 对调用者来说不需要关系结果是由谁来实现,关心的是工厂提供的是客户想要的结果。
2、对于扩展来说,对原来代码无影响,只需要扩展实现类,无须改动原代码。
缺点:
1、每次有新的扩展类增加,都需要去改动工厂的代码,这相工厂与实现的依赖性比较强,两者间的耦合性较高。
2、可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP).另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。
3、开放性比较差。在例子中只实现了宝码和保时捷,如果这个时候用户要求代理商提供奔驰,哪现在的代理商(工厂)就无能为力了,必须修改工厂中的代码才可以。
例子:
有一间汽车制造代理商(工厂),客户只需要向代理商购买(定做)自己喜欢牌子的车即可。代理商不自己按排工人来实现,而是外包给专门的汽车制造商来实现。制造好之后,客户只需要来向代理商提车即可,而不关心是代理商自己制造还是交给其它人制造。
类图:
代理商类(工厂):
carfactory.h
/**************************************************************
filename : carfactory.h
author: fengsh
QQ:19985430
blog :http://blog.csdn.net/fengsh998
*************************************************************/
#ifndef CAR_FACTORY_H
#define CAR_FACTORY_H
#include "car.h"
#include "string"
class CarFactory
{
public:
CarFactory(void);
~CarFactory(void);
Car* getCar(const std::string carlogo);
};
#endif
carfactory.cpp
#include "StdAfx.h"
#include "carfactory.h"
#include "car.h"
CarFactory::CarFactory(void)
{
}
CarFactory::~CarFactory(void)
{
}
Car* CarFactory::getCar( const std::string carlogo )
{
if (carlogo == "BMW")
{
return new BMWCarProductor();
}
if (carlogo == "Porsche")
{
return new PorscheCarProductor();
}
return NULL;
}
具体的制造商实现类,这里有一宝码制造商和保时捷制造商。
car.h
/**************************************************************
filename : car.h
author: fengsh
QQ:19985430
blog :http://blog.csdn.net/fengsh998
*************************************************************/
#ifndef CAR_H
#define CAR_H
#include "string"
class Car
{
public:
Car(void);
~Car(void);
virtual void viewEngine() = 0;
virtual void carStart() = 0;
virtual void carStop() = 0;
};
class BMWCarProductor : public Car
{
public:
BMWCarProductor();
~BMWCarProductor();
void viewEngine();
void carStart();
void carStop();
private:
std::string m_engine;
};
class PorscheCarProductor : public Car
{
public:
PorscheCarProductor();
~PorscheCarProductor();
void viewEngine();
void carStart();
void carStop();
private:
std::string m_engine;
};
#endif
car.cpp
#include "StdAfx.h"
#include "car.h"
#include "iostream"
Car::Car(void)
{
}
Car::~Car(void)
{
}
BMWCarProductor::BMWCarProductor()
{
this->m_engine = "BMW";
}
BMWCarProductor::~BMWCarProductor()
{
}
void BMWCarProductor::viewEngine()
{
std::cout<<"The engine is "<<this->m_engine<<std::endl;
}
void BMWCarProductor::carStart()
{
std::cout<<"The BMW Start."<<std::endl;
}
void BMWCarProductor::carStop()
{
std::cout<<"The BMW Stop."<<std::endl;
}
PorscheCarProductor::PorscheCarProductor()
{
this->m_engine = "Porsche";
}
PorscheCarProductor::~PorscheCarProductor()
{
}
void PorscheCarProductor::viewEngine()
{
std::cout<<"The engine is "<<this->m_engine<<std::endl;
}
void PorscheCarProductor::carStart()
{
std::cout<<"The Porsche Start."<<std::endl;
}
void PorscheCarProductor::carStop()
{
std::cout<<"The Porsche Stop."<<std::endl;
}
Client调用演示
int _tmain(int argc, _TCHAR* argv[])
{
CarFactory * carfactroy = new CarFactory();
Car *car = carfactroy->getCar("Porsche");
if (car)
{
car->viewEngine();
car->carStart();
car->carStop();
delete car;
}
delete carfactroy;
system("pause");
return 0;
}