为什么要使用工厂模式:
工厂模式在用于代码维护的时候作用非常强大:
例如:我们在c++写类的构造函数的时候,可能需要出现多个类的构造函数重载;
那么在我们new一个对象的时候,当我们升级产品,产品功能变多了,也就是类的构造方法可能多了一些成员属性,
这时候加入我们new出一百个对象的,这时候就是需要改变一百次代码,因为构造函数变了;
可是如果我们采用工厂模式,只需要改变创建工厂就好了,只需该一次。说的是啥???看看下面的例子吧
工厂模式主要分为以下三种
1:简单工厂模式
类似一个丰田工厂可以生产的车型很多,COLORA(卡罗拉),CROWN(皇冠),VIOS(威驰)等,工厂模式就可以提供一个接口,这个接口决定是生产的是COLORA(卡罗拉),CROWN(皇冠)还是VIOS(威驰)。
#include <iostream>
using namespace std;
enum CarModel{CAROLLA,VIOS,CROWN};
class Car{
public:
virtual void show() = 0;
};
class Vios :public Car{
void show(){
cout<<"i am Vios"<<endl;
}
};
class Crown : public Car{
void show(){
cout<<"i am crown"<<endl;
}
};
class Calolla : public Car{
void show(){
cout<<"i am Colora"<<endl;
}
};
class Factory{
public:
Car* create_car(CarModel model)
{
switch ( model) {
case CAROLLA:
return new Calolla;
break;
case VIOS:
return new Vios;
break;
case CROWN:
return new Crown;
break;
}
}
};
int main(int argc, char *argv[])
{
//创建工厂
Factory *f = new Factory;
//创建产品 卡罗拉
Car *f1 = f->create_car(CAROLLA);
//创建产品 威驰
Car *f2 = f->create_car(VIOS);
//创建产品 皇冠
Car *f3 = f->create_car(CROWN);
f1->show();
f2->show();
f3->show();
return 0;
}
输出结果:
i am Colora
i am Vios
i am Crown
以上的简单工厂模式实现了只需创建一个车厂,便可生产多种车型,
可以上面的问题是,当我们车厂业务扩大,比如说需要生产台汉兰达,那么上面的简单工厂模式就不够用了,这时候需要,改变工厂的
Car* create_car(CarModel model)方法,以及设计新的汉兰达车型类,以实现新的车型生产, 这就违反了开放封闭原则,(类、模块、函数)可以扩展,但是不可以修改,于是,就出现了工厂方法模式。所谓工厂方法模式,
是指定义一个用于创建对象的接口,让子类决定实例化哪一个类所以这时候下面的工厂方法模式就发挥作用了,
上面的简单工厂模式其实并没有什么卵用!!!
2:工厂方法模式
#include <iostream>
using namespace std;
enum CarModel{CAROLLA,VIOS,CROWN};
class Car{
public:
virtual void show() = 0;
};
class Factory{
public:
virtual Car* create_car() = 0;
};
class Vios :public Car{
void show()
{
cout<<"i am vios"<<endl;
}
};
class Crown : public Car{
void show()
{
cout<<"i am crown"<<endl;
}
};
class Calolla : public Car{
public:
void show()
{
cout<<"i am calolla"<<endl;
}
};
//将卡罗拉,威驰,皇冠分成三个工厂
class ViosFactoy: public Factory
{
public:
Car* create_car()
{
return new Vios;
}
};
class CrownFactoy: public Factory
{
public:
Car* create_car()
{
return new Crown;
}
};
class CorallaFactoy: public Factory
{
public:
Car* create_car()
{
return new Calolla;
}
};
int main(int argc, char *argv[])
{
//创建卡罗拉工厂
CorallaFactoy *CaFa = new CorallaFactoy;
Car *Ca1= CaFa->create_car();
Ca1->show();
//创建威驰工厂
ViosFactoy *ViFa = new ViosFactoy;
Car *Ca2= ViFa->create_car();
Ca2->show();
//创建皇冠工厂
CrownFactoy *CiFa = new CrownFactoy;
Car *Ca3= CiFa->create_car();
Ca3->show();
return 0;
}实现了将工厂以及车都设置抽象类,卡罗拉工厂专门生成卡罗拉,皇冠工厂专门生成皇冠,威驰工厂专门生产威驰。
3 : 抽象工厂模式
为什么要有抽象工厂模式,举个很简单的例子,卡罗拉车型可以分为低配,中配,高配,其他车型也是如此
这时候还是开三家工厂,一家卡罗拉生成低配,中配,高配车型,其他也是如此。
代码如下
#include <iostream>
using namespace std;
enum CarModel{CAROLLA,VIOS,CROWN};
enum CarollaModel{LOW,MID,HIGN};
class Car{
public:
virtual void show() = 0;
};
class Factory{
public:
virtual Car* create_car(CarollaModel mode) = 0;
};
class CalollaLow : public Car{
public:
void show()
{
cout<<"i am low calolla"<<endl;
}
};
class CalollaMid : public Car{
public:
void show()
{
cout<<"i am mid calolla"<<endl;
}
};
class CalollaHign : public Car{
public:
void show()
{
cout<<"i am hign calolla"<<endl;
}
};
class CorallaFactoy: public Factory
{
public:
Car* create_car(CarollaModel model)
{
switch(model)
{
case LOW:
return new CalollaLow;
break;
case MID:
return new CalollaMid;
break;
case HIGN:
return new CalollaHign;
break;
}
}
};
int main(int argc, char *argv[])
{
//创建卡罗拉工厂
CorallaFactoy *CaFa = new CorallaFactoy;
Car *Ca1= CaFa->create_car(LOW);
Ca1->show();
Car *Ca2= CaFa->create_car(MID);
Ca2->show();
Car *Ca3= CaFa->create_car(HIGN);
Ca3->show();
return 0;
}