Summary
o metodă din fabrică creează obiecte noi conform instrucțiunilor clientului. O modalitate de a crea obiecte în JavaScript este invocarea unei funcții constructor cu noul operator. Cu toate acestea, există situații în care clientul nu știe sau nu ar trebui să știe care dintre mai mulți candidați obiectează să instantieze. Metoda din fabrică permite clientului să delege crearea de obiecte, păstrând în același timp controlul asupra tipului de instanțiere.
obiectivul cheie al metodei din fabrică este extensibilitatea. Metodele din fabrică sunt frecvent utilizate în aplicații care gestionează, întrețin sau manipulează colecții de obiecte care sunt diferite, dar în același timp au multe caracteristici (adică metode și proprietăți) în comun. Un exemplu ar fi o colecție de documente cu un amestec de documente Xml, documente Pdf și documente Rtf.
diagrama
participanți
- Creator – în codul de probă: Fabrica
- ‘fabrica’ obiect care creează noi produse
- implementează ‘factoryMethod’ care returnează produse nou create
- AbstractProduct — nu este utilizat în JavaScript
- declară o interfață pentru produse
- ConcreteProduct — în exemplu de cod: angajați
- produsul creat
- toate produsele acceptă aceeași interfață (proprietăți și metode)
exemplu de cod în Javascript
în acest exemplu JavaScript obiectul fabrică creează patru tipuri diferite de angajați. Fiecare tip de angajat are o rată orară diferită. Metoda createEmployee este metoda reală din fabrică. Clientul instruiește fabrica ce tip de angajat să creeze prin trecerea unui argument de tip în metoda fabricii.
produsul Abstract din diagramă nu este implementat deoarece Javascript nu acceptă clase abstracte sau interfețe. Cu toate acestea, trebuie să ne asigurăm că toate tipurile de angajați au aceeași interfață (proprietăți și metode).
sunt create patru tipuri diferite de angajați; toate sunt stocate în aceeași matrice. Fiecare angajat este rugat să spună ce sunt și rata lor orară.
funcția log este un ajutor care colectează și afișează rezultatele.
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