[设计模式]创建模式-抽象工厂(C++描述)
[设计模式]创建模式-抽象工厂(C++描述)
second60 20180425
1. 抽象工厂
在我理解,抽象工厂其实是工厂模式的升级版,不同之处是:工厂模式是对一类对象的创建,而抽象工厂是对多类对象的创建。
2. 抽象工厂和工厂模式的区别
工厂模版只是处理一类对象创建
抽象工厂能对多类对象的创建
3. 抽象工厂的类图
图中可以看出,相比升级版权的工厂模式,此模式多了,不同的抽象产品,工厂即可以创建AbstartProductA类的产品,也可以创建AbstarctProductB类的产品。
4 例子
某个交通工具生产厂商,即可以生产摩托车,也可以生产汽车。车有分低中高端区别。摩托车有低端A摩托,中端B摩托.汽车有低端A汽车,中端B汽车.低商厂品由厂商A提供,中端车由厂商B提供。
分析:
a) 这里分两个类型的产品,分别为:Moto, Car两个抽象类,Moto有MotoA(低端),MotoB(中端),Car有CarA(低端),CarB(中端)
b) 工厂分低中高级别,低端车由低端厂生产FactoryA,中端车由中端厂生产FactoryB,高端车由高端厂生产FactoryC。
类汇总:
1. 工厂抽象类:CarFactory
2. 工厂实现类:CarFactoryA(低端),CarFactoryB(中端),CarFactoryC(高端),
3. 汽车抽象类:Car
4. 汽车实现类:CarA, CarB
5. 摩托抽象类:Moto
6. 摩托实现类:MotoA, MotoB
根据抽象工厂模式,代码如下:
// 汽车抽象类
class Car{public: virtual ~Car()=0;};
//汽车实现类
class CarA:public Car{};
class CarB:public Car{};
class CarC:public Car{}; // 新加高端车
// 摩托抽象类
class Moto{public:virtual ~Moto()=0;};
//摩托现实类
class MotoA:public Moto{};
class MotoB:public Moto{};
class MotoC:public Moto{}; // 新加高端车
//工厂抽象类
class CarFactory{
public : virtual ~CarFactory()=0;
virtual Moto* createMoto() = 0;
virtual Car* createCar() = 0;
};
// 低端工厂
class CarFactoryA{
public : ~CarFactoryA(){};
Moto* createMoto(){return new MotoA();}
Car* createCar(){return new CarA();}
};
// 中端工厂
class CarFactoryB{
public : ~CarFactoryB(){};
Moto* createMoto(){return new MotoB();}
Car* createCar(){return new CarB();}
};
// 高端工厂
class CarFactoryC{
public : ~CarFactoryC(){};
Moto* createMoto(){return new MotoC();}
Car* createCar(){return new CarC();}
};
5 分析
a) 支持多类产品:抽象工厂可以支持多个不同产品的创建,如上面:汽车,摩托两类
b) 扩展性好:如交通公司本来只生产低中端汽车和摩托,业务扩大后,生产高端汽车,只需添加高端工厂和高端车即可
再者,交通公司除了生产摩托和汽车外,又生产火车,飞机等,在抽象工厂类添加新交通公司,并在具体工厂生产,即可支持新类型产品。
c) 抽象工厂模式拥工厂模式的优点
6 总结
抽象工厂其实是工厂方法的升级版,区别是:工厂方法只处理一类产品,而抽象工厂可以处理多类产品。
工厂模式和抽象工厂都是很常用的创建设计模式,相同也包括了最基本的面象对象设计思想,把一类产品抽象化,然后通过继续来实现具体类,最后利用多态来实现不同产品的生产。
下一节,单例,为最最最常用的设计模式,值得关注。