目录
一、为什么要使用工厂模式
优点
缺点
二、简单工厂(Simple Factory)
好处:
不足:
三、工厂方法:
好处:
不足:
四、抽象工厂(Abstract Factory)
一、为什么要使用工厂模式
主要是对对象的创建
进行了一个封装;
因此也属于创建型模式。
目的:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了;
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以;
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
二、简单工厂(Simple Factory)
把对象的创建封装在一个接口函数里面,通过传入不同的标识,返回创建的对象
好处:
可以看到,简单工厂
可以做到,让用户创建对象的时候只需要知道对象的名称(BMW
、AUDI
)就好,而不需要关心创建对象的细节(BMW是如何建造的、型号是什么等等细节
)。
不足:
每当我们想要扩展对象的时候(增加BENZ
的对象)就需要在SimpleFactory
类中添加代码,增加switch
后面的case
选项。这样一来,就需要修改源代码。灵活性
非常的差!!!
那么,能不能做到添加对象的时候,不对现有代码进行修改呢?(也就是我们开发软件时候需要遵守的开-闭原则)
这便是接下来工厂方法:
三、工厂方法:
一个派生类就代表着一个工厂,每个工厂都有具体要生产的产品。
FActory基类,提供了一个纯虚函数(创建产品),定义派生类(具体产品的工厂)负责创建对应的产品,
//工厂方法:
class Factory
{
public: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);}
};void main()
{Factory* bmwfty = new BMWFactory();Factory* audifty = new AudiFactory();Car* p1 = bmwfty->createCar("X6");Car* p2 = audifty->createCar("A6");p1->show();p2->show();
}
当我们想要增加新的工厂:比如说奔驰工厂的时候,根本不用去管宝马和奥迪,只需要增加一个新的工厂就行了,所以说是符合了软件设计的 “开闭原则” : 对已有的功能关闭,对扩展开放
好处:
可以做到不同的产品,在不同的工厂里面创建(模块化非常清晰),能够对现有工厂,以及产品的修改关闭
不足:
实际上,很多产品是有关联关系的,属于一个产品簇,不应该放到不同的工厂里面去创建,这样
一是不符合实际的产品对象创建逻辑,二是工厂类太多了,不好维护
四、抽象工厂(Abstract Factory)
应用于有关联关系的产品
上面的简单工厂已经能够满足基本的要求了,但是在实际生活中,比如宝马企业,不止有汽车,还有别的系列产品,比如:车灯、轮胎。。。也就是跟汽车有关的一组产品
代码
继承关系如下:
//系列产品1:
class Car
{
public:Car(string name):_name(name){}virtual void show(){}protected:std::string _name;
};class BMW:public Car
{
public:BMW(string name):Car(name){}void show() {cout << "这是一辆宝马" << endl;}
};class Audi :public Car
{
public:Audi(string name) :Car(name){}void show() {cout << "这是一辆奥迪" << endl;}
};
//系列产品 2:
class Light
{
public:virtual void show(){}
};
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 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();}
};
使用:
void main()
{AbstractFactory* bmwfty = new BMWFactory();AbstractFactory* audifty = new AudiFactory();Car* p1 = bmwfty->createCar("X6");Car* p2 = audifty->createCar("A6");p1->show();p2->show();Light* l1 = bmwfty->createLight();Light* l2 = audifty->createLight();l1->show();l2->show();
}