工厂模式:包括简单工厂模式、抽象工厂模式、工厂方法模式
简单工厂模式:主要用于创建对象。用一个工厂来根据输入的条件产生不同的类,然后根据不同类的虚函数得到不同的结果。
工厂方法模式:修正了简单工厂模式中不遵守开放封闭原则。把选择判断移到了客户端去实现,如果想添加新功能就不用修改原来的类,直接修改客户端即可。
抽象工厂模式:定义了一个创建一系列相关或相互依赖的接口,而无需指定他们的具体类。
简单工厂模式
主要用于创建对象。用一个工厂来根据输入的条件产生不同的类,然后根据不同类的虚函数得到不同的结果。
应用场景:
适用于针对不同情况创建不同类时,只需传入工厂类的参数即可,无需了解具体实现方法。例如:计算器中对于同样的输入,执行不同的操作:加、减、乘、除。
实现方式
#include <iostream>#include <vector>using namespace std;// Here is the product classclass Operation{public:int var1, var2;virtual double GetResult(){double res = 0;return res;}};class Add_Operation : public Operation{public:virtual double GetResult(){return var1 + var2;}};class Sub_Operation : public Operation{public:virtual double GetResult(){return var1 - var2;}};class Mul_Operation : public Operation{public:virtual double GetResult(){return var1 * var2;}};class Div_Operation : public Operation{public:virtual double GetResult(){return var1 / var2;}};// Here is the Factory classclass Factory{public:static Operation *CreateProduct(char op){switch (op){case '+':return new Add_Operation();case '-':return new Sub_Operation();case '*':return new Mul_Operation();case '/':return new Div_Operation();default:return new Add_Operation();}}};int main(){int a, b;cin >> a >> b;Operation *p = Factory::CreateProduct('+');p->var1 = a;p->var2 = b;cout << p->GetResult() << endl;p = Factory::CreateProduct('*');p->var1 = a;p->var2 = b;cout << p->GetResult() << endl;return 0;}
工厂方法模式
修正了简单工厂模式中不遵守开放封闭原则。把选择判断移到了客户端去实现,如果想添加新功能就不用修改原来的类,直接修改客户端即可。
应用场景:
一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
一个类通过其派生类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其派生类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,派生类对象将覆盖父类对象,从而使得系统更容易扩展。
将创建对象的任务委托给多个工厂派生类中的某一个,客户端在使用时可以无须关心是哪一个工厂派生类创建产品派生类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
#include <iostream>#include <vector>using namespace std;// Here is the product classclass Operation{public:int var1, var2;virtual double GetResult(){double res = 0;return res;}};class Add_Operation : public Operation{public:virtual double GetResult(){return var1 + var2;}};class Sub_Operation : public Operation{public:virtual double GetResult(){return var1 - var2;}};class Mul_Operation : public Operation{public:virtual double GetResult(){return var1 * var2;}};class Div_Operation : public Operation{public:virtual double GetResult(){return var1 / var2;}};class Factory{public:virtual Operation *CreateProduct() = 0;};class Add_Factory : public Factory{public:Operation *CreateProduct(){return new Add_Operation();}};class Sub_Factory : public Factory{public:Operation *CreateProduct(){return new Sub_Operation();}};class Mul_Factory : public Factory{public:Operation *CreateProduct(){return new Mul_Operation();}};class Div_Factory : public Factory{public:Operation *CreateProduct(){return new Div_Operation();}};int main(){int a, b;cin >> a >> b;Add_Factory *p_fac = new Add_Factory();Operation *p_pro = p_fac->CreateProduct();p_pro->var1 = a;p_pro->var2 = b;cout << p_pro->GetResult() << endl;Mul_Factory *p_fac1 = new Mul_Factory();Operation *p_pro1 = p_fac1->CreateProduct();p_pro1->var1 = a;p_pro1->var2 = b;cout << p_pro1->GetResult() << endl;return 0;}
抽象工厂模式
定义了一个创建一系列相关或相互依赖的接口,而无需指定他们的具体类。
应用场景:
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
系统中有多于一个的产品族,而每次只使用其中某一产品族。
属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的
产品等级结构。
////
#include <iostream>#include <vector>using namespace std;// Here is the product classclass Operation_Pos{public:int var1, var2;virtual double GetResult(){double res = 0;return res;}};class Add_Operation_Pos : public Operation_Pos{public:virtual double GetResult(){return var1 + var2;}};class Sub_Operation_Pos : public Operation_Pos{public:virtual double GetResult(){return var1 - var2;}};class Mul_Operation_Pos : public Operation_Pos{public:virtual double GetResult(){return var1 * var2;}};class Div_Operation_Pos : public Operation_Pos{public:virtual double GetResult(){return var1 / var2;}};/*********************************************************************************/class Operation_Neg{public:int var1, var2;virtual double GetResult(){double res = 0;return res;}};class Add_Operation_Neg : public Operation_Neg{public:virtual double GetResult(){return -(var1 + var2);}};class Sub_Operation_Neg : public Operation_Neg{public:virtual double GetResult(){return -(var1 - var2);}};class Mul_Operation_Neg : public Operation_Neg{public:virtual double GetResult(){return -(var1 * var2);}};class Div_Operation_Neg : public Operation_Neg{public:virtual double GetResult(){return -(var1 / var2);}};/*****************************************************************************************************/// Here is the Factory classclass Factory{public:virtual Operation_Pos *CreateProduct_Pos() = 0;virtual Operation_Neg *CreateProduct_Neg() = 0;};class Add_Factory : public Factory{public:Operation_Pos *CreateProduct_Pos(){return new Add_Operation_Pos();}Operation_Neg *CreateProduct_Neg(){return new Add_Operation_Neg();}};class Sub_Factory : public Factory{public:Operation_Pos *CreateProduct_Pos(){return new Sub_Operation_Pos();}Operation_Neg *CreateProduct_Neg(){return new Sub_Operation_Neg();}};class Mul_Factory : public Factory{public:Operation_Pos *CreateProduct_Pos(){return new Mul_Operation_Pos();}Operation_Neg *CreateProduct_Neg(){return new Mul_Operation_Neg();}};class Div_Factory : public Factory{public:Operation_Pos *CreateProduct_Pos(){return new Div_Operation_Pos();}Operation_Neg *CreateProduct_Neg(){return new Div_Operation_Neg();}};int main(){int a, b;cin >> a >> b;Add_Factory *p_fac = new Add_Factory();Operation_Pos *p_pro = p_fac->CreateProduct_Pos();p_pro->var1 = a;p_pro->var2 = b;cout << p_pro->GetResult() << endl;Add_Factory *p_fac1 = new Add_Factory();Operation_Neg *p_pro1 = p_fac1->CreateProduct_Neg();p_pro1->var1 = a;p_pro1->var2 = b;cout << p_pro1->GetResult() << endl;return 0;}
