Existe momentos em que o cliente não conhece exatamente que tipo deve construir. Isso pode ser resolvido fácilmente com o uso de tipos base ou interface e a fábrica pode passar parâmetros ou outros tipos de informações para tomar essa decisão para o cliente. Um exemplo disso são os provider especificos dos objetos ADO.NET(DbConnection, DbCommand, DbDataAdapter, etc).
Os contrutores não passam muito bem a sua intenção quando existem vários overloads por que eles necessitam ter o mesmo nome da classe (ou Sub New no VB.NET). Construtores com muitos overloads acabam confundindo os desenvolvedores na hora de decidir qual deles usar. Substituir construtores por métodos factory que mostram a sua intenção muitas vezes é o melhor a fazer.
Exemplo:
Vários construtores sobrecarregados, qual deles você deveria usar?
// C# public Veiculo (int passageiros); public Veiculo (int passageiros, int cavalosPotencia); public Veiculo (int rodas, bool trailer); public Veiculo (string tipo);
' VB.NET Public Sub New(ByVal passageiros As Integer) Public Sub New(ByVal passageiros As Integer, ByVal cavalosPotencia As Integer) Public Sub New(ByVal rodas As Integer, ByVal trailer As Boolean) Public Sub New(ByVal tipo As String)
Com o padrão Factory o código fica mais expressivo e os desenvolvedores mais produtivos:
// C# public Veiculo CriaCarro(int passageiros); public Veiculo CriaSport(int passageiros, int cavalosPotencia); public Veiculo CriaOnibus(int rodas, bool trailer); public Veiculo CriaBarco(); public Veiculo CriaMoto();
' VB.NET Public Function CriaCarro(ByVal passageiros As Integer) As Veiculo Public Function CriaSport(ByVal passageiros As Integer, ByVal cavalosPotencia As Integer)As Veiculo Public Function CriaOnibus(ByVal rodas As Integer, ByVal trailer As Boolean)As Veiculo Public Function CriaBarco()As Veiculo Public Function CriaMoto()As Veiculo
Para ver um exemplo do padrão AbstractFactory na prática é só baixar o projeto que segue no link abaixo:
http://cid-17621fcd61d3a95a.skydrive.live.com/self.aspx/Blog/AbstractFactory.zip (VS 2008)
Até a próxima...