Closed. This question is opinion-based。它当前不接受答案。












想改善这个问题吗?更新问题,以便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/

10-12 14:51
查看更多