() translation by (you can also view the original English article)
Quando pensas numa fábrica, o que vem a tua cabeça? Para mim, é um local onde as coisas são criadas – isto é um local centralizado onde as coisas são produzidas. Mais tarde a entrega do produtos é feita pela fábrica baseado numa ordem.
Vamos assumir que estás a requisitar um carro. A fábrica irá criar um baseado nas especificações de trabalho dessa ordem e irá então entregar uma vez que esteja completo.
Assim como os seu homólogos do mundo real, uma fábrica de software(isto é, software que implementa o padrão de design factory(fábrica), é um objeto que é responsável por criar e entregar outros objetos baseados nos parâmetros de entrada.
Existem três variações do padrão factory(fábrica):
- Padrão simples Factory(fábrica). Este permite interfaces para criar objetos sem expor a criação lógica para o cliente.
- Padrão método Factory(fábrica). Este permite interfaces para criar objetos, mas permite subclasses para determinar qual classe instanciar.
- Padrão abstrato Factory(fábrica). Ao contrários dos dois padrões acima, uma fábrica abstrata é uma interface para criar objetos relacionados sem especificar/expor as suas classes. Nós podemos também dizer que providencia um objeto de outra fábrica que é responsável por criar os objetos necessários.
Problema
Vamos assumir que tens uma classe carro que contêm todas as propriedades e métodos relevantes de um automóvel. Na sua forma mais básica, irias criar desta forma:
1 |
$car = new Car(); |
Imediatamente, com o passar do tempo existe a necessidades de algumas alterações da forma como o objeto Carro é criado. Nós necessitamos de criar objetos da classe que são baseados no tipo de carrinho em vez de apenas um Carro. Assim tens que fazer alterações em todos os sítios onde crias-te um objeto da classe Carro.
Mas, com o passar do tempo, haverá inevitavelmente a necessidade de alterações na forma como o objeto Carro é criado. Por exemplo, nós temos que criar classes baseadas no tipo do carro em vez de um simples carro.
Em vez de fazer isso, seria uma melhor decisão criar uma classe que implementa o padrão Factory(fábrica).
Solução
Na secção anterior, reconhecemos que estávamos a criar um objeto do tipo carro usando a keywordnew
. Mais tarde, é decidido criar um objeto da classe Carro, mas baseado no tipo de Carro como Sedan, SUV, etc.
Entretanto devemos colocar o código do tipo de Carro na classe criada em todos os sítios onde possa ser necessário ou para implementar Factory(fábrica) de uma forma efetiva. Por favor consulta o bloco de código abaixo o qual mostra a implementação do simples padrão Factory(fábrica).
1 |
<?php
|
2 |
|
3 |
class carFactory { |
4 |
|
5 |
public function __construct() { |
6 |
// ... //
|
7 |
}
|
8 |
|
9 |
public static function build ($type = '') { |
10 |
|
11 |
if($type == '') { |
12 |
throw new Exception('Invalid Car Type.'); |
13 |
} else { |
14 |
|
15 |
$className = 'car_'.ucfirst($type); |
16 |
|
17 |
// Assuming Class files are already loaded using autoload concept
|
18 |
if(class_exists($className)) { |
19 |
return new $className(); |
20 |
} else { |
21 |
throw new Exception('Car type not found.'); |
22 |
}
|
23 |
}
|
24 |
}
|
25 |
}
|
Na classe acima, podes ver que temos um método estático disponível, o qual é responsável por criar um objeto baseado no tipo que tu passas. Agora necessitamos de uma classe concreta de diferentes tipos de carro, como a que nós temos abaixo:
1 |
<?php
|
2 |
|
3 |
class car_Sedan { |
4 |
|
5 |
public function __construct() { |
6 |
echo "Creating Sedan"; |
7 |
}
|
8 |
|
9 |
}
|
10 |
|
11 |
class car_Suv { |
12 |
|
13 |
public function __construct() { |
14 |
echo "Creating SUV"; |
15 |
}
|
16 |
|
17 |
}
|
Neste momento, nós temos as nossa classes factory(fábrica) e concrete(concreta) prontas para ser usadas, vamos praticar para criar os tipos de carros necessários .
1 |
// Creating new Sedan
|
2 |
$sedan = carFactory::build('sedan'); |
3 |
|
4 |
// Creating new SUV
|
5 |
$suv = carFactory::build('suv'); |
Adição de uma nova classe
A adição de uma nova classe é simples: Cria uma classe concreta e está pronto. Por exemplo:
1 |
<?php
|
2 |
class car_Luxury { |
3 |
|
4 |
public function __construct() { |
5 |
echo "Creating Luxury"; |
6 |
}
|
7 |
|
8 |
}
|
9 |
|
10 |
// Creating new Luxury
|
11 |
$luxury = carFactory::build('luxury'); |
Conclusão
No que diz respeito ao padrão factory(fábrica), considera o uso da keyword new
prejudicial. Factory(fábrica) permite-nos ter uma localização centralizada onde todos os nossos objetos são criados.
Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!