1、简单工厂模式
对于没有接触过设计模式的新手来说,当遇到一组从同一接口继承的类族时,为了取用方便,可能通过新建一个类同时实现取用类的方法。通过向这个方法传入不同参数,从而获得想要的具体类达到降低代码耦合的目的。该模式好比一个万能型的工厂,该工厂可能只有一条生产线,同时可以生产哇哈哈和爽歪歪,不过可以向生产线输入不同的参数,从而控制其具体生产的产品。模式具体类图如下:
具体代码如下:
#include<iostream>
using namespace std;
class Product{
public:
virtual void show() = 0;
};
class Wahaha:public Product{
virtual void show();
};
void Wahaha::show(){
cout<<"the product is wahaha!"<<endl;
}
class Shuangwaiwai:public Product{
virtual void show();
};
void Shuangwaiwai::show(){
cout<<"the product is shuangwaiwai!"<<endl;
}
const int WAHAHA_INDEX = 0;
const int SHUANGWAIWAI_INDEX = 1;
class SimpleFactory{
public:
static Product* getProduct(int index);
};
Product* SimpleFactory::getProduct(int index){
if(index == WAHAHA_INDEX){
return new Wahaha();
}else if(index == SHUANGWAIWAI_INDEX){
return new Shuangwaiwai();
}
return NULL;
}
int main(){
Product* product1 = SimpleFactory::getProduct(WAHAHA_INDEX);
Product* product2 = SimpleFactory::getProduct(SHUANGWAIWAI_INDEX);
product1->show();
product2->show();
return 0;
}
2、工厂方法模式
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但是由于在工厂类中存在关于类选择的逻辑判断,导致每增加一个新的类必将增加工厂类中的分支条件,这样就违背了开放-封闭原则。而工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类中。
具体就好比一个工厂不断壮大之后,为了使产品质量更加稳定,决定取缔之前的万能生产线政策,转而让每一条生产线或者工厂只生产一件产品,然后产生了哇哈哈厂和爽歪歪厂。工厂方法模式类图如下:
其代码举例如下:
#include<iostream>
using namespace std;
class Product{
public:
virtual void show() = 0;
};
class Wahaha:public Product{
virtual void show();
};
void Wahaha::show(){
cout<<"the product is wahaha!"<<endl;
}
class Shuangwaiwai:public Product{
virtual void show();
};
void Shuangwaiwai::show(){
cout<<"the product is shuangwaiwai!"<<endl;
}
class Factory{
public:
virtual Product* getProduct() = 0;
};
class WahahaFactory{
public:
virtual Product* getProduct();
};
Product* WahahaFactory::getProduct(){
return new Wahaha();
}
class ShuangwaiwaiFactory{
public:
virtual Product* getProduct();
};
Product* ShuangwaiwaiFactory::getProduct(){
return new Shuangwaiwai();
}
int main(){
Product* product1 = (new WahahaFactory())->getProduct();
Product* product2 = (new ShuangwaiwaiFactory())->getProduct();
product1->show();
product2->show();
return 0;
}