//工厂模式
//工厂模式主要为创建对象提供过渡接口 以便将创建对象的过程屏蔽起来
//何时使用
//1、当客户程序不需要知道要使用对象的创建过程
//2、客户程序使用的对象存在变动的可能,或者根本不知道使用哪一个具体的对象
//工厂负责创造对象(new对象)
#include <stdio.h>
#include <string>
class Car
{
public: //默认私有 结构体默认公有
virtual void drive(){};
};
class Car_Benz:public Car
{
public:
virtual void drive()
{
printf("Benz drived\n");
}
};
class Car_Bmw:public Car
{
public:
virtual void drive()
{
printf("Bmw drived\n");
}
};
class Car_Audi:public Car
{
public:
virtual void drive()
{
printf("Audi drived\n");
}
};
//简单工厂模式 定义一个用于创建对象的接口
class Driver_easy //简单工厂 需要什么对象 给他new一个
{
public:
Car* driveCar(std::string s) //switch...
{
if(s=="Benz")
return new Car_Benz;
else if(s=="Bmw")
return new Car_Bmw;
else if(s=="Audi")
return new Car_Audi;
else
return 0;
}
};
//开闭原则:对扩展开放 对修改封闭
//用户增加一辆车时 只要符合制定合同 只要通知工厂类知道就可以被客户使用了 所以对产品部分他符合开闭原则
//但是工厂(这个例子中指司机)部分每次增加产品 都要增加相应业务 违背开闭原则
//针对简单工厂模式的不足出现了 ——工厂方法模式
//工厂纯虚 由子类工厂负责对象接口的创建
class Driver_create //这个工厂符合开闭原则(对扩展开放 对修改封闭) 只负责提供方法链接的工厂 (中介)
{
public:
virtual Car* driveCar()=0; //不虚的话不会调用子类的方法
};
class Driver_Benz:public Driver_create//开benz的司机
{
public:
virtual Car* driveCar()
{
return new Car_Benz;
}
};
class Driver_Bmw:public Driver_create//开Bmw的司机
{
public:
virtual Car* driveCar()
{
return new Car_Bmw;
}
};
class Driver_Audi:public Driver_create//开Audi的司机
{
public:
virtual Car* driveCar()
{
return new Car_Audi;
}
};
class User //客户避免了直接创建产品对象责任 仅仅负责消费产品
{
public:
void use(std::string s)
{
Driver_create* driver;//工厂
//if(s=="Benz")
//{
// driver = new Driver_Benz;
//}
//else if(s=="Bmw")
//{
// driver = new Driver_Bmw;
//}
//else if(s=="Audi")
//{
// driver = new Driver_Audi;
//}
//两种工厂在新产品加入时 都需要对代码修改
//一个修改工厂 一个增加工厂子类尽管后者符合开闭
// 需要怎么解决????
driver = new Driver_Benz;
Car* car = driver->driveCar();
//简单工厂
//Car* car = (new Driver_easy)->driveCar("Benz"); //告诉司机开benz
car->drive();//命令开车 而不用再说一次开benz
}
};
void Factory_test()
{
User user;
user.use("Audi");
}