怎么做网络销售的网站,讷河市铁道北建设高架桥,ps做网站教程,淘特app推广代理抽象工厂模式仍然属于创建型模式#xff0c;我们在【简单工厂和工厂方法模式】这篇文章中#xff0c;描述了简单工厂和工厂方法模式#xff0c;并在文末#xff0c;简单介绍了工厂方法模式的局限性。
本文将通过汽车工厂的例子继续来阐述使用抽象工厂模式相比较于工厂方法…抽象工厂模式仍然属于创建型模式我们在【简单工厂和工厂方法模式】这篇文章中描述了简单工厂和工厂方法模式并在文末简单介绍了工厂方法模式的局限性。
本文将通过汽车工厂的例子继续来阐述使用抽象工厂模式相比较于工厂方法模式的优势。 文章目录 工厂方法模式回顾抽象工厂模式代码使用抽象工厂的局限性 工厂方法模式回顾
工厂方法模式通过允许类将实例化延迟到子类中来实现使得增加新的产品类不需要修改现有系统的代码。例如一个汽车制造商需要不同类型的汽车如宝马、奥迪等每种汽车的制造过程可能不同
#include iostream
#include string
#include memory
using namespace std;class Car {
public:Car(string name) : name_(name) { }virtual ~Car(){}virtual void show() 0;
protected:string name_;
};class Bmw : public Car {
public:Bmw(string name) : Car(name) { }void show() { cout 获得一辆宝马汽车 name_ endl; }
};class Audi : public Car {
public:Audi(string name) : Car(name) { }void show() { cout 获得一辆奥迪汽车 name_ endl; }
};//工厂方法
class Factory {
public:virtual ~Factory() {}virtual Car* createCar(string name) 0; //工厂方法
};//宝马工厂
class BMWFactory : public Factory {
public:Car* createCar(string name) { return new Bmw(name); }
};
//奥迪工厂
class AudiFactory : public Factory {
public:Car* createCar(string name) { return new Audi(name); }
};int main () {unique_ptrFactory bmwFactory(new BMWFactory());unique_ptrFactory audiFactory(new AudiFactory());unique_ptrCar p1(bmwFactory-createCar(X6));unique_ptrCar p2(audiFactory-createCar(A8));p1-show();p2-show();return 0;
}现在我们考虑这样一种情况如果我们现在要生产的产品是一组有关联的产品簇怎么办难道我们像工厂方法一样又新建立一个工厂来生产该产品吗
比如说我们之前有了奥迪工厂和宝马工厂现在我们需要生产奥迪车灯和宝马车灯难道又建立奥迪车灯工厂吗
这样的话最后我们需要管理的工厂类那也太多了所以很容易想到
我们应该对一组有关联关系的产品簇提供产品对象的统一创建。这就是抽象工厂模式。
抽象工厂模式
我们把之前的工厂方法类写成抽象工厂类并且里面提供创建车灯的方法
并且我们直接在宝马工厂和奥迪工厂去创建车灯
//系列产品一:汽车
class Car {
public:Car(string name) : name_(name) { }virtual ~Car(){}virtual void show() 0;
protected:string name_;
};
class Bmw : public Car {
public:Bmw(string name) : Car(name) { }void show() { cout 获得一辆宝马汽车 name_ endl; }
};
class Audi : public Car {
public:Audi(string name) : Car(name) { }void show() { cout 获得一辆奥迪汽车 name_ endl; }
};
//系列产品二车灯
class Light {
public:virtual ~Light() {}virtual void show() 0;
};
class BmwLight : public Light{
public:void show() { cout BMW light! endl;};
};
class AudiLight : public Light{
public:void show() { cout Audi light! endl;};
};//工厂方法 》 抽象工厂对一组有关联关系的产品簇提供产品对象的统一创建
class AbstractFactory {
public:virtual ~AbstractFactory() {}virtual Car* createCar(string name) 0; //工厂方法 创建汽车virtual Light* createLight() 0; // 工厂方法 创建汽车关联的产品--车灯
};//宝马工厂
class BMWFactory : public AbstractFactory {
public:Car* createCar(string name) { return new Bmw(name); }Light* createLight() {return new BmwLight();}
};
//奥迪工厂
class AudiFactory : public AbstractFactory {
public:Car* createCar(string name) { return new Audi(name); }Light* createLight() {return new AudiLight();}
};代码使用
int main () {unique_ptrAbstractFactory bmwFactory(new BMWFactory());unique_ptrAbstractFactory audiFactory(new AudiFactory());unique_ptrCar p1(bmwFactory-createCar(X6));unique_ptrCar p2(audiFactory-createCar(A8));unique_ptrLight l1(bmwFactory-createCarLight());unique_ptrLight l2(audiFactory-createCarLight());p1-show();l1-show();p2-show();l2-show();return 0;
}抽象工厂的局限性
我们设想这样一种场景比如说我们的宝马工厂需要创建一个新的类对象产品但是奥迪工厂并不需要但是如果宝马工厂想要创建该类 我们也比赛在抽象工厂类中去定义这样一个虚函数尽管奥迪工厂并不需要创建该类对象他还是不得不去重写该虚函数。这样是不符合逻辑的。 总结 简单工厂Simple Factory: 优点把对象的创建封装在一个接口函数里面通过传入不同的标识返回创建的对象用户不用自己负责new对象不用了解对象创建的详细过程 缺点提供创建对象实例的接口函数不闭合不能对修改关闭 工厂方法Factory Method 优点Fatcory基类提供了一个纯虚函数创建产品定义派生类具体产品的工厂负责创建对应的产品可以做到不同的产品在不同的工厂里面创建能够对现有工厂以及产品的修改关闭 缺点实际上很多产品是有管理关系的属于一个产品簇不应该放在不同的工厂里面去创建这样一是不符合实际的产品对象创建逻辑二是工厂类太多了不好维护 抽象工厂Abstract Factory 优点把有关联关系的属于一个产品簇的所有产品创建的接口函数放在一个抽象工厂里面AbstractFactory类派生类具体产品的工厂应该负责创建该产品簇里面所有的产品。