Ну, не уверен, что это дело называется "фабрикой по записи", но я для себя это дело именую именно так. Суть лучше проиллюстрирую на Delphi-коде:
Type
TThing = Class
// whatever fields and methods
Constructor Create(Const aS: String); Virtual;
End;
TThingClass = Class Of TBase;
TThingLink = Record
ID: Integer;
ClassType: TThingClass;
End;
TThingFactory = Class
Private
fData: Array Of TThingLink;
fCount, fSize: Integer;
Public
Constructor Create;
Destructor Destroy; Override;
Procedure AddLink(aID: Integer; aType: TThingClass);
Function Build(aID: Integer; aS: String): TThing;
End;
Implementation
Constructor TThingFactory.Create;
Begin
fCount := 0;
fSize := 10;
SetLength(fData, fSize);
End;
Destructor TThingFactory.Destroy;
Begin
SetLength(fData, 0);
End;
Procedure TThingFactory.AddLink(aID: Integer; aType: TThingClass);
Var
I: Integer;
Begin
I := 0;
While (I < fCount) And (fData[I].ID <> aID) Do Inc(I);
If I < fCount
Then Raise Exception.Create('Duplicate ID: ' + IntToString(aID) + '; classes ' +
fData[ID].ClassType.ClassName + ' and ' + aType.ClassName);
If fCount = fSize
Then Begin
fSize := 2*fSize;
SetLength(fData, fSize);
End;
With fData[fCount] Do Begin
ID := aID;
ClassType := aType;
End;
Inc(fCount);
End;
Function TThingFactory.Build(aID: Integer; aS: String): TThing;
Var
I: Integer;
Begin
I := 0;
While (I < fCount) And (fData[I].ID <> aID) Do Inc(I);
If I = fCount
Then Raise Exception.Create('No thing with such ID')
Else Result := fData[I].ClassType.Create(aS);
End;
Это самый-самый примитивный вариант, конечно же. Такая штуковина полезна, например, разбирать пришедшие по сети пакеты: скажем, если в заголовке стоит нолик, то это InitSessionMessage, если единичка — AuthorisationRequestMessage, и т.д. Наследуем все сообщения от одного базового класса, запихиваем в фабрику, каждое сообщение поддерживает конструктор, который инициализирует поля из сырого куска байтов... и все. Пришел пакет — вызвали MessageFactory.Build(Packet.ID, Packet.Data), и получили распарсенное сообщение.
Появились новые сообщения — написали новый класс, дописали строчку с MessageFactory.Add(100500, NewMessage.ClassType), и все. Это вообще может быть сделано во внешнем подключаемом модуле, о которым ты вообще не знаешь, потому что его писали уже пользователи/доработчики напильником по месту внедрения.
Собсно, вопрос — а как такая штуковина поизящней делается на C#? Там что-то тоже было такое, но может, есть какие тонкости? В Delphi, например, классу надо иметь виртуальный конструктор, иначе может не взлететь.
P.S. "Фабрикой по записи" я это называю потому, что каждый класс сам по желанию "записывается" на фабрику.