Pergunta

Eu estava me perguntando, Por que fazer estática Create existem métodos?

Por exemplo, por que usar este código:

System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);

sobre este código:

System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);

Não consigo encontrar a justificativa para usar uma sobre a outra e não consigo encontrar nenhuma relação entre classes que usam esse construto sobre o outro.

Alguém pode lançar alguma luz sobre isso?

Foi útil?

Solução

XMLReader é uma classe abstrata. Você não pode instanciar isso.

Fornecendo a Create O método é uma instância do padrão de fábrica. Dependendo dos argumentos especificados, uma implementação diferente do XMLReader é escolhida e devolvida. Por exemplo, existem implementações XMLReader validador e não validador na estrutura .NET.

Outras dicas

Uma resposta mais geral ...

A razão pela qual pessoas como esses tipos de métodos, conhecidos como "métodos estáticos de fábrica", é porque você pode dar a eles um nome (em oposição aos construtores). Portanto, se você precisar de três construtores diferentes, poderá criar métodos estáticos de fábrica que tenham nomes relevantes para o seu uso.

Outro motivo é que um método de fábrica realmente não precisa criar novos objetos - ele pode retornar o mesmo repetidamente, se necessário.

Porque ele pode realmente criar e objeto de tipo derivado que você não tem acesso ou retorna uma classe abstrata (como o DTB respondeu). Isto é padrão de método de fábrica.

Um construtor só pode ser usado para criar instâncias de uma classe específica, enquanto um estático Create O método pode criar uma instância de diferentes classes, dependendo da entrada.

No caso do XmlReader Classe o Create Método retornará um XmlDictionaryReader, XmlTextReader, XmlValidatingReader ou XmlNodeReader, dependendo da sobrecarga que você usa e de quais parâmetros você envia.

Este padrão permite o XmlReader classe para fornecer a você instâncias de classes derivadas adaptadas aos parâmetros que você passou Create. Note em particular as sobrecargas que aceitam um XmlReaderSettings objeto. Diferente XmlReader A subclasse pode ser devolvida a você, dependendo das suas configurações.

Um exemplo melhor é WebRequest.Create(url). Dependendo do URL que você passa, você pode receber um HttpWebRequest, um FtpWebRequest, etc.

  • Porque você não precisa se comprometer com a classe exata de objeto que recebe. Os construtores podem construir apenas objetos exatamente de uma classe.
  • Porque você pode dar ao método um nome significativo, por exemplo, bigint.probablePrime (). Os construtores só podem ter o mesmo nome da classe.
  • Como você pode ter mais de um método de fábrica para a mesma combinação de tipo de parâmetro, por exemplo, ponto.

(Uma resposta muito mais detalhada é apresentada no 'Java Efetivo' de Bloch.)

Às vezes eles existem como uma forma de auto-documentação. Eu tenho um componente de acesso a dB que posso instanciar com uma string de conexão ou o nome da conexão no arquivo de configuração. Ambos os métodos tomam cordas como um parâmetro para que não possam ser diferenciadas apenas por argumentos. Então eu criei um FromConnectionString(string) método de fábrica e um FromConnectionName(string) Método da fábrica. Esta nuance seria totalmente perdida por um new Foo(bool, string) linha.

A idéia é que dessa maneira eles possam alterar a implementação do XMLReader e não quebrar nenhum código de usuário (por exemplo, eles podem alterar o tipo real que é retornado do método Create).

Pessoalmente, não gosto dessa abordagem, porque ela cria um relacionamento inverso na hierarquia da classe XMLReader. Talvez eles pensassem que o padrão de fábrica é um exagero?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top