pattern patrones patron method ejemplo diseño c# oop design-patterns factory-method

patrones - patron de diseño abstract factory c# ejemplo



¿Está bien que un método de fábrica devuelva nulo? (4)

Creo que es potencialmente razonable que un método de fábrica devuelva nulo en algunas situaciones, pero no si es un método llamado CreateCommand . Si fuera GetCommand o FetchCommand , eso podría estar bien ... pero un método Create debería generar una excepción en caso de falla, sugeriría.

Si realmente desea que se devuelva null en esta situación, depende del panorama general, por supuesto. (¿Hay una implementación de objeto nulo razonable que podría devolver, por ejemplo?)

Me estoy preguntando acerca de las mejores prácticas aquí. ¿Es una buena práctica que un método de fábrica devuelva nulo si no puede crear nada? Aquí hay un ejemplo:

ICommand command = CommandFactory.CreateCommand(args); if (command != null) command.Execute(); else // do something else if there is no command

Una alternativa sería devolver un NullCommand o algo así, supongo, pero ¿cuál es la mejor práctica?


Devolver null en este caso hará que tu método sea más difícil de usar; los clientes deben ser conscientes de una condición de falla implícita. En su lugar, lance una excepción y también puede proporcionar un método separado para que los clientes prueben esta condición:

if (CommandFactory.CanCreate(args)) { ICommand command = CommandFactory.Create(args); command.Execute(); }

O hacer que la fábrica sea instantánea; lo que sería mejor si necesita preprocesar args :

CommandFactory factory = new CommandFactory(args); if (factory.IsValid()) { ICommand command = factory.Create(); command.Execute(); }

La interfaz de la fábrica ahora deja claro y explícito que la creación puede fallar, pero aún requiere que el cliente use el método de verificación. Otra opción es esta:

ICommand command; if (CommandFactory.TryCreate(args, out command)) { // creation succeeded ... }


Estoy de acuerdo con Jon Skeet. CreateCommand claramente implica construcción.

Si no lanza una Exception , entonces, en ese escenario, iría personalmente con la implementación NullCommand , para evitar sentencias condicionales en todos los consumidores y posibles errores de NullReferenceException .


Solo tiene sentido devolver Null si hay una razón por la que querría que el usuario tenga que verificar si cada vez que llama a Create. Normalmente consideraría el siguiente patrón de uso perfectamente válido:

var obj = MyFactory.CreateThing(); obj.DoSomething();

Pero lo que estás proponiendo es forzar el siguiente patrón de uso:

var obj = MyFactory.CreateThing(); if (obj == Null) { // Handle null condition } else { obj.DoSomething(); }

Normalmente, el escenario Null significaría algún tipo de falla, en cuyo caso una Excepción probablemente tendría más sentido. Pero en última instancia, usted es el creador de música aquí y tiene que decidir qué es sensible en el mundo que está construyendo.