Factory

//工厂模式
//工厂模式主要为创建对象提供过渡接口 以便将创建对象的过程屏蔽起来

//何时使用
//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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值