Summary
Un metodo Factory crea nuovi oggetti come indicato dal client. Un modo per creare oggetti in JavaScript è invocando una funzione di costruttore con il nuovo operatore. Tuttavia, ci sono situazioni in cui il client non sa, o non dovrebbe, quale dei diversi oggetti candidati creare un’istanza. Il metodo Factory consente al client di delegare la creazione di oggetti mantenendo comunque il controllo sul tipo da istanziare.
L’obiettivo chiave del metodo Factory è l’estensibilità. I metodi di fabbrica sono spesso utilizzati in applicazioni che gestiscono, mantengono o manipolano raccolte di oggetti che sono diversi ma allo stesso tempo hanno molte caratteristiche (cioè metodi e proprietà) in comune. Un esempio potrebbe essere una raccolta di documenti con un mix di documenti Xml, documenti Pdf e documenti Rtf.
Diagramma
Partecipanti
- Creator In Nel codice di esempio: Fabbrica
- la ‘fabbrica’ oggetto che crea nuovi prodotti
- implementa ‘factoryMethod’ che restituisce appena creato prodotti
- AbstractProduct — non utilizzato in JavaScript
- dichiara un’interfaccia per i prodotti
- ConcreteProduct — Nel codice di esempio: Dipendenti
- prodotto che viene creato
- tutti i prodotti supportano la stessa interfaccia (proprietà e metodi)
codice di Esempio in JavaScript
In questo esempio JavaScript Fabbrica oggetto crea quattro diverse tipologie di dipendenti. Ogni tipo di dipendente ha una tariffa oraria diversa. Il metodo createEmployee è il metodo Factory effettivo. Il client indica alla factory quale tipo di dipendente creare passando un argomento di tipo nel metodo Factory.
L’AbstractProduct nel diagramma non è implementato perché Javascript non supporta classi o interfacce astratte. Tuttavia, dobbiamo ancora assicurarci che tutti i tipi di dipendenti abbiano la stessa interfaccia (proprietà e metodi).
Vengono creati quattro diversi tipi di dipendenti; tutti sono memorizzati nello stesso array. Ad ogni dipendente viene chiesto di dire cosa sono e la loro tariffa oraria.
La funzione log è un helper che raccoglie e visualizza i risultati.
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