When we say, client sends data in 1 above, what is the format of the data ? If it is serialized stream of bytes, how will the server determine on which exact concrete type it should initialized for the respective data stream ? This actually makes the things more complicated.
If possible, let's have a common header part in the data itself, which describes the client type. Then, inside the method HandleData(), we should have that client type passed, which will initialize the concrete type of the client, and pass the remaining data to initialize the object. Here, you can use Object pool pattern ( <a href="https://en.wikipedia.org/wiki/Object_pool_pattern")a[
^] for better efficiency. Or even prototype pattern ( <a href="https://en.wikipedia.org/wiki/Prototype_pattern")a[
^] may work.