大家好,
请问有人可以解释一下工厂方法模式和桥接模式的区别吗?因为我理解,这两个设计模式都用于分离界面和实现:
将抽象与实现解耦。抽象将客户端代码与实现分开。因此,实现可以更改而不影响客户端代码,并且在实现更改时无需编译客户端代码。
工厂方法:
没有工厂方法的问题:
有些情况下,我们有一个包含一些类以实现客户业务逻辑的库。从客户应用程序中,我们创建库类的对象来完成任务。
但是,有时基于客户要求来纳入其他功能,我们可能需要在库中添加其他类。然后我们需要在客户端应用程序中创建新类的对象。
因此,每次在库方面进行新改变时,客户端都需要在其端进行一些相应的更改并重新编译代码。
使用工厂方法:
为了避免这个问题,我们使用工厂方法将对象创建与客户端应用程序解耦。客户端只需要调用库的工厂方法即可,无需担心对象创建的实际实现。
因此,我们创建工厂方法来创建对象并将其移动到单独的实现文件中。 现在,实现文件是唯一需要了解派生类的文件。因此,如果对任何派生类进行更改或添加任何新类,则只需重新编译实现文件。使用工厂的每个人都只关心接口,这应该在应用程序的整个生命周期中保持一致。
客户端应用程序交互-->工厂方法和调用-->实现
如果我采用下面的示例程序,在添加任何类或更改类之后,只需要重新编译Vehicle.cpp文件就足够了吗? 另外,在创建工厂方法时,我们是否使用静态方法?
Vehicle.h
#include <iostream>
using namespace std;
enum VehicleType {
VT_TwoWheeler, VT_ThreeWheeler, VT_FourWheeler
};
// Library classes
class Vehicle {
public:
virtual void printVehicle() = 0;
static Vehicle* Create(VehicleType type);
};
class TwoWheeler : public Vehicle {
public:
void printVehicle() {
cout << "I am two wheeler" << endl;
}
};
class ThreeWheeler : public Vehicle {
public:
void printVehicle() {
cout << "I am three wheeler" << endl;
}
};
class FourWheeler : public Vehicle {
public:
void printVehicle() {
cout << "I am four wheeler" << endl;
}
};
Vehicle.cpp (实现文件)
// Factory method to create objects of different types.
// Change is required only in this function to create a new object type
Vehicle* Vehicle::Create(VehicleType type) {
if (type == VT_TwoWheeler)
return new TwoWheeler();
else if (type == VT_ThreeWheeler)
return new ThreeWheeler();
else if (type == VT_FourWheeler)
return new FourWheeler();
else return NULL;
}
Client.h文件
// Client class
class Client {
public:
// Client doesn't explicitly create objects
// but passes type to factory method "Create()"
Client()
{
VehicleType type = VT_ThreeWheeler;
pVehicle = Vehicle::Create(type);
}
~Client() {
if (pVehicle) {
delete[] pVehicle;
pVehicle = NULL;
}
}
Vehicle* getVehicle() {
return pVehicle;
}
private:
Vehicle *pVehicle;
};
// Driver program
int main() {
Client *pClient = new Client();
Vehicle * pVehicle = pClient->getVehicle();
pVehicle->printVehicle();
return 0;
}
请提供您对此的想法。
提前致谢。
delete[]
是错误的。安全的做法是从Create
返回unique_ptr
。 - Davis Herring