简单工厂模式
实验环境 Ubuntu14.04
简单工厂模式是由一个工厂对象(Factory)决定创建出哪一种产品(Product)的实例
#ifndef __SIMPLEfACTORY_H_
#define __SIMPLEfACTORY_H_
#include <stdio.h>
#include <string>
#include <assert.h>
class CarBase
{
public:
virtual void printName(){ printf("%s\n",name.c_str()); }
virtual ~CarBase() = default;
protected:
CarBase() = default;
CarBase(std::string name_):name(name_){}
private:
std::string name;
};
class GMCar : public CarBase
{
public:
GMCar():CarBase("GNCar")
{
}
void printName()
{
printf("GMCar Test.\n");
CarBase::printName();
}
~GMCar() = default;
};
class FordCar : public CarBase
{
public:
FordCar():CarBase("FordCar")
{
}
void printName()
{
printf("FordCar Test.\n");
CarBase::printName();
}
~FordCar() = default;
};
class ToyotaCar : public CarBase
{
public:
ToyotaCar():CarBase("ToyotaCar")
{
}
void printName()
{
printf("ToyotaCar Test.\n");
CarBase::printName();
}
~ToyotaCar() = default;
};
//由一个工厂对象(Factory)决定创建出哪一种产品(Product)的实例
class CarFactory
{
public:
static CarBase* create(const std::string name)
{
CarBase* car = NULL;
if("GM" == name)
car = new GMCar();
if("Toyota" == name)
car = new ToyotaCar();
if("Ford" == name)
car = new FordCar();
return car;
}
};
#endif
简单工厂测试代码
#include "simplefactory.h"
int main()
{
CarBase* car = CarFactory::create("GM");
car->printName();
delete car;
car = CarFactory::create("Ford");
car->printName();
delete car;
car = CarFactory::create("Toyota");
car->printName();
delete car;
return 0;
}
缺点
简单工厂由于工厂类集中了所有实例的创建逻辑,违反了高内聚的责任分配原则,将全部逻辑集中到了一个
工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。