Padrão de método de fábrica
As fábricas de telefones celulares fabricam telefones celulares, as fábricas de sabão fabricam sabonetes e as farmacêuticas fabricam medicamentos.
Suponha que exista uma grande classe de objetos A1, A2, A3, A4 ... todos eles têm uma classe pai comum A
A1 pode ser vista como um telefone celular, A2 pode ser vista como sabão ...
(A1Factory no exemplo abaixo é uma fábrica de telefones celulares, A2Factory é uma fábrica de sabão)
Então, como usar o padrão de método de fábrica para criar esses objetos? Veja um exemplo
1. Defina a interface de uma fábrica e o método de retornar uma entidade
interface Factory{
// 定义一个方法,返回A
A create();
}
2. Para cada objeto, defina e crie sua fábrica, e cada fábrica implementa a interface de fábrica da primeira etapa
class A1Factory implement Factory{
// A1的工厂类,返回A1对象,用A引用返回出来
public A creat(){
return new A1();
}
}
class A2Factory implement Factory{
// A2的工厂类,返回A2对象,也用A引用返回出来
public A creat(){
return new A2();
}
}
A3、A4类似
3. Ao usar
Vendo o seguinte efeito, você provavelmente pode entender o que significa: O objeto é criado pela classe pai da fábrica e também acessado pela classe pai A. Isso é equivalente a proteger a diferença de subclasses, desde que uma fábrica seja alterada na origem, o A retornado é o objeto da subclasse correspondente ao A gerado na fábrica.
public A getObj(Factory f){
return f.create();
}
main(){
// 给手机工厂,出来就是手机对象
A A1 = getObj(new A1Factory());
// 给肥皂工厂,出来就是肥皂对象
A A2 = getObj(new A2Factory());
}
Prós e contras
Obviamente, o padrão do método de fábrica, cada objeto precisa ser criado para ele criar uma classe de fábrica correspondente. Isso é uma vantagem e uma desvantagem.
A vantagem é que, em comparação com a fábrica simples, isso atrasa a instanciação da classe para a fábrica da subclasse.
As falhas são por causa disso, toda vez que existe um novo tipo, é necessário criar uma fábrica correspondente, que parece redundante.
Expandir
Freqüentemente, em cada fábrica de subclasse do padrão de método de fábrica, o padrão simples de fábrica é usado.
Em outras palavras, o método create de A1Factory não necessariamente retorna apenas A1. Pode ser uma subclasse de A1. Para qual, você pode adicionar um parâmetro de tipo ao método create e distingui-lo de acordo com o tipo.
Em resumo, isso significa que, na produção real, em muitos casos, vários padrões de design são usados juntos, não apenas um determinado padrão de design.