しかし、ファブリッククラス(これらのオブジェクトを生成する)に の場合、スイッチを実装する必要があります。私が間違っている?
いいえ、あなたは間違っていません。スイッチの多相性は良いことですが、例外もあります。そのような例外の1つは、パラメータ化された工場を持っている場合です。これは絶対に受け入れられます。したがって、条件に基づいて特殊なクラスを作成するクライアントコードの代わりに、そのようなファクトリを作成するよう依頼します。ファクトリーは、そのクラスインスタンスの作成のみを担当し、新しいクラスが導入された場合、ファクトリーのみがクライアントコードではなく変更されます。だからではなく、本の
:
public class Client {
public string Serialize<T>(string contentType, T instance) where T : class {
switch(contentType) {
case "XML":
return new XMLSerializer().Serialize(instance);
case "JSON":
return new JSONSerializer().Serialize(instance);
}
}
}
あなたはこの必要があります:
public interface ISerializer {
string Serialize(object instance);
object Deserialize(string content);
}
public class XMLSerializer : ISerializer { }
public class JSONSerializer : ISerializer { }
public class SerializerFactory() {
public static ISerializer CreateSerializer(string type) {
switch(type) {
case "XML":
return new XMLSerializer();
case "JSON":
return new JSONSerializer();
}
}
}
public class Client {
public string ParseAPIResponse(string contentType, string responseData) {
ISerializer serializer = SerializerFactory.CreateSerializer(contentType);
var responseObj = serializer.Deserialize(responseData);
}
}
注意が工場を変更するには、1つだけの理由も、それは新しいシリアライザの紹介ですので、我々はあることができますここではSRPで良い。さらに、ファクトリーの変更を避ける方法もあります。設定ファイルを使用して識別子タイプのマッピングを格納するか、ファクトリに別のメソッドを公開するだけで、ユーザーが新しいタイプなどを登録できるようになります。
どのプログラミング言語で答えが欲しいですか? C#? – Sweeper
。私はPHPが好きですが、C#またはJavaも問題ありません。 –