Closed. This question is opinion-based。它当前不接受答案。
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
2年前关闭。
Improve this question
这是我的问题,我正在考虑在C++中使用工厂方法,您对此有何看法?
有一个基类和很多子类。
我需要通过TCP在网络上传输对象。
我将在第一侧创建对象,并使用该对象创建一个字节数组TCP消息,并将其发送到另一侧。
另一方面,我将分解TCP消息,创建对象,并将该对象添加到多态队列中。
您甚至可以通过使用从套接字读取的缓冲区作为Bike的_data结构来避免某些内存碎片。
与往常一样,仔细阅读您正在使用的模式是个好主意。这是Factory Method Pattern上的Wikipedia文章。
您还应该查看Boost Serialization库。它可以帮助您跨字节序和字长不同的系统对数据进行序列化。我上面详细介绍的方法非常简单,不会处理类似的事情。
想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
2年前关闭。
Improve this question
这是我的问题,我正在考虑在C++中使用工厂方法,您对此有何看法?
有一个基类和很多子类。
我需要通过TCP在网络上传输对象。
我将在第一侧创建对象,并使用该对象创建一个字节数组TCP消息,并将其发送到另一侧。
另一方面,我将分解TCP消息,创建对象,并将该对象添加到多态队列中。
最佳答案
简短的回答:是的。
长答案:您想要的是工厂方法模式。
您的网络消息需要在消息头中包含要反序列化的对象的类型和大小,然后在接收方,您的工厂方法可以使用并反序列化其余消息主体以构造对象。
一个简单的好策略是让所有类将要序列化的数据存储在私有(private)结构中,并通过电线发送它们。其他未序列化的类数据将不在此结构中。这样,您只需花费最少的工作就可以将整个结构转储到网络上。显然,如果您要跨平台使用(即,从大到小或从小到大的字节序),则可能必须考虑字节顺序的注意事项。
像这样的东西(我确信这还远远不够,因为我只是在脑海中写下来):
enum VehicleType
{
VehicleType_Car,
VehicleType_Bike
};
class Vehicle
{
virtual size_t GetDataSize() = 0;
virtual void* GetData() = 0;
};
class Bike : Vehicle
{
private:
VehicleType _type;
size_t _dataSize;
struct BikeData
{
char[100] name;
// etc
} _data;
public:
Bike(void* data)
: Bike(static_cast<BikeData*>(data)->name)
{
}
Bike(char[]& name)
: _type(VehicleType_Bike), _dataSize(sizeof(BikeData))
{
memset(&_data.name, 0, 99);
strncpy(&_data.name, name, 99);
}
virtual size_t GetDataSize() { return _dataSize; }
virtual void* GetData() { return &_data; }
};
class Car : Vehicle
{
// etc
};
void SendVehicle(int socket, const Vehicle& vehicle)
{
write(socket, vehicle.GetData(), vehicle.GetDataSize());
}
Vehicle* ReceiveVehicle(int socket)
{
VehicleType type;
size_t dataSize;
read(socket, &type, sizeof(VehicleType));
read(socket, &dataSize, sizeof(size_t));
BYTE* data = new BYTE[dataSize];
read(socket, &data, dataSize);
Vehicle v* = CreateVehicle(type, dataSize, data);
delete[] data;
return v;
}
// The factory method.
Vehicle* CreateVehicle(VehicleType type, size_t dataSize, void* data)
{
switch(type)
{
case VehicleType_Car: return new Car(data);
case VehicleType_Bike: return new Bike(data);
}
return 0;
}
您甚至可以通过使用从套接字读取的缓冲区作为Bike的_data结构来避免某些内存碎片。
与往常一样,仔细阅读您正在使用的模式是个好主意。这是Factory Method Pattern上的Wikipedia文章。
您还应该查看Boost Serialization库。它可以帮助您跨字节序和字长不同的系统对数据进行序列化。我上面详细介绍的方法非常简单,不会处理类似的事情。
关于c++ - 工厂方法是否针对我的问题进行了适当的设计? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2711704/