Summary
a Factory Method creates new objects as instructed by the client. Uma maneira de criar objetos em JavaScript é invocando uma função de construtor com o novo operador. No entanto, existem situações em que o cliente não sabe, ou não deve saber, qual dos vários objetos candidatos a instanciar. O método de fábrica permite ao cliente delegar a criação de objetos, mantendo o controle sobre qual tipo de instanciar.
O principal objetivo do método de fábrica é a extensibilidade. Métodos de fábrica são frequentemente usados em aplicações que gerenciam, mantêm ou manipulam coleções de objetos diferentes, mas ao mesmo tempo têm muitas características (ou seja, métodos e propriedades) em comum. Um exemplo seria uma coleção de documentos com uma mistura de documentos Xml, documentos Pdf e documentos Rtf.
Diagrama
os Participantes
- Criador — No exemplo de código: Fábrica
- a ‘fábrica’ de objeto que cria novos produtos
- implementa ‘factoryMethod”, que retorna recém-criada produtos
- AbstractProduct — não utilizadas em JavaScript
- declara uma interface para produtos
- ConcreteProduct — No código de exemplo: Empregados
- o produto que está sendo criado.
- todos os produtos suportam a mesma interface (propriedades e métodos)
Exemplo de código em JavaScript
neste exemplo de JavaScript o objeto de Fábrica cria quatro diferentes tipos de funcionários. Cada tipo de empregado tem uma taxa horária diferente. O método createemprego é o método de fábrica real. O cliente instrui a fábrica que tipo de empregado criar passando um argumento de tipo para o método de fábrica.
O produto abstrato no diagrama não é implementado porque Javascript não suporta classes abstratas ou interfaces. No entanto, ainda precisamos garantir que todos os tipos de funcionários têm a mesma interface (propriedades e métodos).
quatro tipos diferentes de empregados são criados; todos são armazenados na mesma matriz. Cada funcionário é convidado a dizer o que eles são e sua taxa horária.
a função log é um auxiliar que recolhe e mostra resultados.
function Factory() { this.createEmployee = function (type) { var employee; if (type === "fulltime") { employee = new FullTime(); } else if (type === "parttime") { employee = new PartTime(); } else if (type === "temporary") { employee = new Temporary(); } else if (type === "contractor") { employee = new Contractor(); } employee.type = type; employee.say = function () { log.add(this.type + ": rate " + this.hourly + "/hour"); } return employee; }}var FullTime = function () { this.hourly = "$12";};var PartTime = function () { this.hourly = "$11";};var Temporary = function () { this.hourly = "$10";};var Contractor = function () { this.hourly = "$15";};// log helpervar log = (function () { var log = ""; return { add: function (msg) { log += msg + "\n"; }, show: function () { alert(log); log = ""; } }})();function run() { var employees = ; var factory = new Factory(); employees.push(factory.createEmployee("fulltime")); employees.push(factory.createEmployee("parttime")); employees.push(factory.createEmployee("temporary")); employees.push(factory.createEmployee("contractor")); for (var i = 0, len = employees.length; i Run