Aquí está un ejemplo sencillo derivado de una capa de independencia de la versión he construido para nuestro producto:
interface ICadSystemFactory
{
ICadSystem GetSystemInstance();
}
class 3dCadSystemVersion1 : ICadSystemFactory
{
ICadSystem GetSystemInstance()
{
return new 3dCadSystemWrapperVersion1(new 3dCadSystemVersion1());
}
}
class 3dCadSystemVersion2 : ICadSystemFactory
{
ICadSystem GetSystemInstance()
{
return new 3dCadSystemWrapperVersion2(new 3dCadSystemVersion2());
}
}
Donde los objetos 3dCadSystemWrapperVersionX implementan la interfaz ICadSystem. Utilizo un objeto de registro para decidir qué fábrica base quiero crear en base a ciertos identificadores de versión. Esto me permite conectar nuevas versiones según sea necesario sin alterar la infraestructura existente, lo que resulta útil en este caso. De hecho, me permitiría conectar productos completamente nuevos si fuera necesario, lo que en general podría ser útil, pero en mi caso no vale la pena el esfuerzo de implementación.
Hay tantas buenas explicaciones (como el enlace de Enrico a continuación) de esto para encontrarlas en google o en dos. Realmente no veo ningún valor en reproducir ninguna aquí. Si encuentras una explicación que parece poco convincente, quizás una pregunta sobre los detalles de esa explicación sería más interesante. – djna