设计模式:抽象工厂
在软件系统中,经常面临着“一系列相互依赖的对象”
的创建工作,同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的创建对象的方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合。
定义:提供一个创建一系列或相互依赖对象的接口,而无须指定它们具体的类。
前两天看过工厂模式,其实工厂模式和抽象工厂模式本质是一样,都是通过创建工厂接口的形式对具体的类进行封装,只是抽象工厂是对一系列相互依赖的对象进行封装而已。
举个例子:
假如我们要生产两种手机A和B,每种手机有对应的处理器,显示屏,摄像头等,我在设计架构的时候,每个手机都会对应这三个类,通过工厂模式我们知道,为了避免处理函数直接依赖具体的类,需要为每个类建立相应的工厂。但其实我们发现,每个手机的处理器,显示屏,摄像头是相互关联的,这就用到了抽象工厂,把手机A的三个类都封装在一起就可以了。
代码:
抽象基类:
//抽象基类
//处理器
class phone_cpu {
};
//显示屏
class phone_screen {
};
//摄像头
class phone_camera {
};
手机A和B的具体产品类:
/***********手机A**************/
//处理器
class A_cpu :public phone_cpu {
public:
A_cpu() {
cout << "手机A的处理器搞定~!" << endl;
};
};
//显示器
class A_screen :public phone_screen {
public:
A_screen() {
cout << "手机A的显示器搞定~!" << endl;
};
};
//摄像头
class A_camera :public phone_camera {
public:
A_camera() {
cout << "手机A的摄像头搞定~!" << endl;
};
};
/***********手机B**************/
//处理器
class B_cpu :public phone_cpu{
public:
B_cpu() {
cout << "手机A的处理器搞定~!" << endl;
};
};
//显示器
class B_screen :public phone_screen {
public:
B_screen() {
cout << "手机B的显示器搞定~!" << endl;
};
};
//摄像头
class B_camera :public phone_camera {
public:
B_camera() {
cout << "手机B的摄像头搞定~!" << endl;
};
};
抽象工厂:
class phoneFactory {
public:
virtual phone_cpu* creatCpu() = 0;
virtual phone_screen* creatscreen() = 0;
virtual phone_camera* creatcamera() = 0;
};
具体工厂:
//具体工厂 phoneA
class A_phoneFactory :public phoneFactory{
public:
virtual phone_cpu* creatCpu() {
return new A_cpu;
}
virtual phone_screen* creatscreen() {
return new A_screen;
}
virtual phone_camera* creatcamera() {
return new A_camera;
}
};
//具体工厂 phoneB
class B_phoneFactory :public phoneFactory {
public:
virtual phone_cpu* creatCpu() {
return new B_cpu;
}
virtual phone_screen* creatscreen() {
return new B_screen;
}
virtual phone_camera* creatcamera() {
return new B_camera;
}
};
抽象工厂模式与工厂方法模式的区别
- 抽象工厂模式是工厂方法模式的升级版,它用来创建一组相关或者相互依赖的对象。
- 它与工厂方法模式的区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品等级结构,表现为一个接口或抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。
- 在抽象工厂模式中,有一个产品族的概念,所谓产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成了一个产品族;而工厂方法提供的一系列产品称为一个等级结构。
- 如果产品全部属于同一个等级结构(即同一个接口或抽象类),则属于工厂方法模式;如果产品来自多个等级结构(即多个不同的接口或抽象类),则属于抽象工厂模式。