Nesta classe $dataestá a classe que usamos para armazenar nossos dados. Agora, para esta classe, digamos que usamos uma Sessão para armazenar nossos dados. A fábrica seria assim:
As fábricas são um padrão de design que usamos para controlar como colocamos os objetos juntos, e o uso de padrões de fábrica corretos nos permite criar os objetos personalizados de que precisamos.
Isso foi muita digitação. Agora terei que colocá-lo no meu wiki em algum momento.
Tyler Carter
1
Agradável e útil. Tiremos o chapéu para você, companheiro.
stefgosselin
1
Qual é a diferença / benefício de seu código $obj = $factory->build();mais $obj = new whateverClass();? Além disso, em outra classe (digamos classZ) que depende dos dados da classeA, onde na classeZ você usaria o método de fábrica? Você ainda está essencialmente instanciando uma classe (classZ) dentro de uma classe (classA), o que significa nenhum teste. por exemplo, a fábrica parece ser uma carga de código para fazer newpor meio de um método em vez de apenas usar new.
James,
19
Como uma fábrica da vida real, ele cria algo e o devolve.
Imagine algo assim
$joe =newJoe();
$joe->say('hello');
ou um método de fábrica
Joe::Factory()->say('hello');
A implementação do método de fábrica criará uma nova instância e a retornará.
Bom exemplo, me surpreende como as implementações são variadas para este padrão. Quando chamado estaticamente, presumo que seja possível obter uma referência para a instância para reutilizar a mesma instância mais tarde? ou seja, $ joe = Joe :: Factory () -> diga ('olá');
stefgosselin
certamente como em 5.6 também se pode fazer (new Joe ()) -> dizer ('olá');
Pancho
12
O padrão de design de fábrica é muito bom quando você está lidando com vários recursos e deseja implementar abstração de alto nível.
Vamos dividir isso em seções diferentes.
Suponha que você tenha que implementar abstração e o usuário de sua classe não precise se preocupar com o que você implementou na definição da classe.
Ele só precisa se preocupar com o uso de seus métodos de classe.
por exemplo, você tem dois bancos de dados para o seu projeto
MySQLDatabaseConnectionYour mysql select query execute here
No futuro, você pode ter um banco de dados diferente, então você não precisa alterar o código inteiro, apenas precisa passar o novo tipo de banco de dados e outro código será executado sem fazer nenhuma alteração.
Padrão de projeto de fábrica (padrão de fábrica) é para acoplamento fraco. Como o significado de fábrica, dados para uma fábrica (produzir dados) para o usuário final. Dessa forma, a fábrica rompe o forte acoplamento entre a fonte de dados e o processo de dados.
O PHP pode criar dinamicamente um objeto a partir do nome da variável usando a seguinte sintaxe:
$Object=new $classname;
onde a variável $ classname contém o nome da classe que se deseja instanciar.
Portanto, a fatoração de objetos clássica seria semelhante a:
function getInstance($classname){if($classname==='Customer'){
$Object=newCustomer();}
elseif($classname==='Product'){
$Object=newProduct();}return $Object;}
e se você chamar a função getInstance ('Produto'), essa fábrica criará e retornará o objeto Produto. Caso contrário, se você chamar a função getInstance ('Customer'), essa fábrica criará e retornará o objeto do tipo Cliente (criado a partir da classe Customer ()).
Não há mais necessidade disso, pode-se enviar 'Produto' ou 'Cliente' (nomes exatos de classes existentes) como um valor de variável para instanciação dinâmica:
$classname='Product';
$Object1=new $classname;//this will instantiate new Product()
$classname='Customer';
$Object2=new $classname;//this will instantiate new Customer()
Para o registro, em palavras fáceis, uma fábrica como @Pindatjuh disse, retorna um objeto.
Então, qual é a diferença com um construtor? (isso faz o mesmo)
um construtor usa sua própria instância.
Algo que eu quero, então algo mais avançado e não quero inchar o objeto (ou adicionar dependências).
O construtor é chamado quando cada instância é criada. Às vezes você não quer isso.
Por exemplo, digamos que toda vez que eu crio um objeto da classe Account, eu leio um arquivo do banco de dados e o uso como template.
Usando o construtor:
classAccount{var $user;var $pwd;var...public __construct(){// here i read from the file// and many other stuff}}
Usando a fábrica:
classAccount{var $user;var $pwd;var...}classAccountFactory{publicstaticCreate(){
$obj=newAccount();// here we read the file and more stuff.return $obj;}
Respostas:
Uma fábrica cria um objeto. Então, se você quiser construir
Você não gostaria de ter que fazer o seguinte código sempre que criar o objeto
É aí que a fábrica entraria. Definimos uma fábrica para cuidar disso por nós:
Agora tudo que temos que fazer é
A verdadeira vantagem é quando você quer mudar de classe. Digamos que quiséssemos passar em uma classe C diferente:
ou uma nova classe B:
Agora podemos usar a herança para modificar facilmente como a classe é criada, para colocar um conjunto diferente de classes.
Um bom exemplo pode ser esta classe de usuário:
Nesta classe
$data
está a classe que usamos para armazenar nossos dados. Agora, para esta classe, digamos que usamos uma Sessão para armazenar nossos dados. A fábrica seria assim:Agora, digamos que queremos armazenar todos os nossos dados no banco de dados, é realmente simples alterá-lo:
As fábricas são um padrão de design que usamos para controlar como colocamos os objetos juntos, e o uso de padrões de fábrica corretos nos permite criar os objetos personalizados de que precisamos.
fonte
$obj = $factory->build();
mais$obj = new whateverClass();
? Além disso, em outra classe (digamos classZ) que depende dos dados da classeA, onde na classeZ você usaria o método de fábrica? Você ainda está essencialmente instanciando uma classe (classZ) dentro de uma classe (classA), o que significa nenhum teste. por exemplo, a fábrica parece ser uma carga de código para fazernew
por meio de um método em vez de apenas usarnew
.Como uma fábrica da vida real, ele cria algo e o devolve.
Imagine algo assim
ou um método de fábrica
A implementação do método de fábrica criará uma nova instância e a retornará.
fonte
O padrão de design de fábrica é muito bom quando você está lidando com vários recursos e deseja implementar abstração de alto nível.
Vamos dividir isso em seções diferentes.
Suponha que você tenha que implementar abstração e o usuário de sua classe não precise se preocupar com o que você implementou na definição da classe.
Ele só precisa se preocupar com o uso de seus métodos de classe.
por exemplo, você tem dois bancos de dados para o seu projeto
Sua classe Factory cuidaria da criação do objeto para conexão com o banco de dados.
O usuário só precisa passar o nome do tipo de banco de dados
Resultado:
No futuro, você pode ter um banco de dados diferente, então você não precisa alterar o código inteiro, apenas precisa passar o novo tipo de banco de dados e outro código será executado sem fazer nenhuma alteração.
Resultado:
Espero que isso ajude.
fonte
Em geral, uma "fábrica" produz algo: no caso da Programação Orientada a Objetos, um "padrão de design de fábrica" produz objetos.
Não importa se é em PHP, C # ou qualquer outra linguagem Orientada a Objetos.
fonte
Padrão de projeto de fábrica (padrão de fábrica) é para acoplamento fraco. Como o significado de fábrica, dados para uma fábrica (produzir dados) para o usuário final. Dessa forma, a fábrica rompe o forte acoplamento entre a fonte de dados e o processo de dados.
fonte
Uma fábrica apenas gera um objeto ou objetos.
Você pode ter uma fábrica que constrói uma conexão MySQL.
http://en.wikipedia.org/wiki/Factory_method_pattern
fonte
Esta resposta é em relação a outro post em que Daniel White disse para usar fábrica para criar a conexão MySQL usando o padrão de fábrica.
Para a conexão MySQL, prefiro usar o padrão singleton, pois você deseja usar a mesma conexão para acessar o banco de dados e não criar outra.
fonte
A abordagem clássica para instanciar um objeto é:
O PHP pode criar dinamicamente um objeto a partir do nome da variável usando a seguinte sintaxe:
onde a variável $ classname contém o nome da classe que se deseja instanciar.
Portanto, a fatoração de objetos clássica seria semelhante a:
e se você chamar a função getInstance ('Produto'), essa fábrica criará e retornará o objeto Produto. Caso contrário, se você chamar a função getInstance ('Customer'), essa fábrica criará e retornará o objeto do tipo Cliente (criado a partir da classe Customer ()).
Não há mais necessidade disso, pode-se enviar 'Produto' ou 'Cliente' (nomes exatos de classes existentes) como um valor de variável para instanciação dinâmica:
fonte
Para o registro, em palavras fáceis, uma fábrica como @Pindatjuh disse, retorna um objeto.
Então, qual é a diferença com um construtor? (isso faz o mesmo)
O construtor é chamado quando cada instância é criada. Às vezes você não quer isso.
Por exemplo, digamos que toda vez que eu crio um objeto da classe Account, eu leio um arquivo do banco de dados e o uso como template.
Usando o construtor:
Usando a fábrica:
fonte