简单工厂模式
定义一个抽象类,即汽车
定义具体的汽车类型,继承自抽象类,即宝马和奔驰
定义一个工厂类,用于生产不同类型的汽车
#include <iostream>
using namespace std;
enum CarType{BENZ, BMW};
class Car//车类
{
public:
virtual void createdCar(void) = 0;
};
class BenzCar : public Car //奔驰车
{
public:
BenzCar()
{
cout<<"Benz::Benz()"<<endl;
}
virtual void createdCar(void)
{
cout<<"BenzCar::createdCar()"<<endl;
}
~BenzCar()
{
}
};
class BmwCar : public Car //宝马车
{
public:
BmwCar()
{
cout<<"Bmw::Bmw()"<<endl;
}
virtual void createdCar(void)
{
cout<<"BmwCar::createdCar()"<<endl;
}
};
class CarFactory //车厂
{
public:
Car* createSpecificCar(CarType type)
{
switch(type)
{
case BENZ://生产奔驰车
return (new BenzCar());
break;
case BMW://生辰宝马车
return (new BmwCar());
break;
default:
return NULL;
break;
}
}
};
int main(int argc, char** argv)
{
CarFactory carfac;
Car* specificCarA = carfac.createSpecificCar(BENZ);//看到网上众多示例在new后没有delete,感觉不是特别严谨
Car* specificCarB = carfac.createSpecificCar(BMW);
delete specificCarA; delete specificCarB;
return 0;
}
为此写了一个实现计算器的代码
#include <iostream>
using namespace std;
class operation //运算的抽象类
{
public:
double number_a=0;
double number_b=0;
public:
void Number_a(double a){number_a=a;}
void Number_b(double b){number_b=b;}
virtual double getResult(){
return 10086;
}
};
class operation_add:public operation // 加法
{
public:
virtual double getResult(){
double result=number_a+number_b;
return result;
}
};
class operation_sub:public operation // 减法
{
public:
virtual double getResult(){
double result=number_a-number_b;
return result;
}
};
class operation_mul:public operation // 乘法
{
public:
virtual double getResult(){
double result=number_a*number_b;
return result;
}
};
class operation_div:public operation // 除法
{
public:
virtual double getResult(){
if(abs(number_b)<1e-7){
std::cout<<"divisor == 0"<<std::endl;
return 0;
}
double result=number_a/number_b;
return result;
}
};
class operationFactory
{
public:
operation* createOperate(char operate){
switch (operate)
{
case '+':
return new operation_add();
break;
case '-':
return new operation_sub();
break;
case '*':
return new operation_mul();
break;
case '/':
return new operation_div();
break;
default:
std::cout<<"Please input correct operation"<<std::endl;
break;
}
}
};
int main(int argc, char** argv)
{
operationFactory factory;
operation* oper=factory.createOperate('*');
oper->Number_a(3);
oper->Number_b(2);
double result=oper->getResult();
cout<<result<<endl;
return 0;
}
简单工厂模式在每次增加新的车型时,需要修改工厂类,这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是,工厂方法模式出现了。
工厂方法模式
建立一个汽车抽象类和工厂抽象类
具体的汽车类型继承自汽车抽象类,如宝马、奔驰
具体生产某种汽车的工厂继承自工厂抽象类,如生产宝马的工厂、生产奔驰的共产
#include <iostream>
using namespace std;
class Car//车类
{
public:
virtual void createdCar(void) = 0;
};
class BenzCar : public Car //奔驰车
{
public:
BenzCar()
{
cout<<"Benz::Benz()"<<endl;
}
virtual void createdCar(void)
{
cout<<"BenzCar::createdCar()"<<endl;
}
~BenzCar()
{
}
};
class BmwCar : public Car //宝马车
{
public:
BmwCar()
{
cout<<"Bmw::Bmw()"<<endl;
}
virtual void createdCar(void)
{
cout<<"BmwCar::createdCar()"<<endl;
}
};
class Factory//车厂
{
public:
virtual Car* createSpecificCar(void) = 0;
};
class BenzFactory : public Factory//奔驰车厂
{
public:
virtual Car* createSpecificCar(void)
{
return (new BenzCar());
}
};
class BmwFactory : public Factory//宝马车厂
{
public:
virtual Car* createSpecificCar(void)
{
return (new BmwCar());
}
};
int main(int argc, char** argv)
{
Factory* factory = new BenzFactory();
Car* specificCarA = factory->createSpecificCar();
factory = new BmwFactory();
Car* specificCarB = factory->createSpecificCar();
delete factory; delete specificCarA; delete specificCarB;
return 0;
}
为此写了一个实现计算器的代码
#include <iostream>
using namespace std;
class operation //运算的抽象类
{
public:
double number_a=0;
double number_b=0;
public:
void Number_a(double a){number_a=a;}
void Number_b(double b){number_b=b;}
virtual double getResult(){
return 0;
}
};
class operation_add:public operation // 加法
{
public:
virtual double getResult(){
double result=number_a+number_b;
return result;
}
};
class operation_sub:public operation // 减法
{
public:
virtual double getResult(){
double result=number_a-number_b;
return result;
}
};
class operation_mul:public operation // 乘法
{
public:
virtual double getResult(){
double result=number_a*number_b;
return result;
}
};
class operation_div:public operation // 除法
{
public:
virtual double getResult(){
if(abs(number_b)<1e-7){
std::cout<<"divisor == 0"<<std::endl;
return 0;
}
double result=number_a/number_b;
return result;
}
};
class operationFactory
{
public:
virtual operation* createOperate(){}
};
class addFactory:public operationFactory
{
public:
virtual operation* createOperate(){return new operation_add();}
};
class subFactory:public operationFactory
{
public:
virtual operation* createOperate(){return new operation_sub();}
};
class mulFactory:public operationFactory
{
public:
virtual operation* createOperate(){return new operation_mul();}
};
class divFactory:public operationFactory
{
public:
virtual operation* createOperate(){return new operation_div();}
};
int main(int argc, char** argv)
{
operationFactory* factory = new addFactory();
operation* oper=factory->createOperate();
oper->Number_a(3);
oper->Number_b(2);
double result=oper->getResult();
cout<<result<<endl;
return 0;
}
抽象工厂模式
在上面的工厂方法模式基础上,有需要生产高配版的奔驰和宝马,那工厂方法模式就有点鞭长莫及了,这就又有抽象工厂模式,UML类图如下:
#include <iostream>
using namespace std;
class Car//车类
{
public:
virtual void createdCar(void) = 0;
};
class BenzCar : public Car //奔驰车
{
public:
BenzCar()
{
cout<<"Benz::Benz()"<<endl;
}
virtual void createdCar(void)
{
cout<<"BenzCar::createdCar()"<<endl;
}
~BenzCar()
{
}
};
class BmwCar : public Car //宝马车
{
public:
BmwCar()
{
cout<<"Bmw::Bmw()"<<endl;
}
virtual void createdCar(void)
{
cout<<"BmwCar::createdCar()"<<endl;
}
};
class HighCar //高配版车型
{
public:
virtual void createdCar(void) = 0;
};
class HighBenzCar : public HighCar //高配奔驰车
{
public:
HighBenzCar()
{
cout<<"HighBenzCarBenz::Benz()"<<endl;
}
virtual void createdCar(void)
{
cout<<"HighBenzCar::createdCar()"<<endl;
}
};
class HighBmwCar : public HighCar //高配宝马车
{
public:
HighBmwCar()
{
cout<<"HighBmwCar::Bmw()"<<endl;
}
virtual void createdCar(void)
{
cout<<"HighBmwCar::createdCar()"<<endl;
}
};
class Factory//车厂
{
public:
virtual Car* createSpecificCar(void) = 0;
virtual HighCar* createdSpecificHighCar(void) = 0;
};
class BenzFactory : public Factory//奔驰车厂
{
public:
virtual Car* createSpecificCar(void)
{
return (new BenzCar());
}
virtual HighCar* createdSpecificHighCar(void)
{
return (new HighBenzCar());
}
};
class BmwFactory : public Factory//宝马车厂
{
public:
virtual Car* createSpecificCar(void)
{
return (new BmwCar());
}
virtual HighCar* createdSpecificHighCar(void)
{
return (new HighBmwCar());
}
};
int main(int argc, char** argv)
{
Factory* factory = new BenzFactory();
Car* specificCar = factory->createSpecificCar();
HighCar* spcificHighCar = factory->createdSpecificHighCar();
delete factory; delete specificCar; delete spcificHighCar;
return 0;
}
觉得写的不错的小伙伴,可以点一个赞哦,多谢!
其他设计模式将在陆续更新中