oversigt
en Fabriksmetode opretter nye objekter som instrueret af klienten. En måde at oprette objekter i JavaScript er ved at påberåbe sig en konstruktørfunktion med den nye operatør. Der er dog situationer, hvor klienten ikke eller burde vide, hvilken af flere kandidatobjekter der skal instantieres. Fabriksmetoden giver klienten mulighed for at delegere objektoprettelse, mens den stadig bevarer kontrollen over, hvilken type der skal instantieres.
hovedformålet med fabriksmetoden er strækbarhed. Fabriksmetoder bruges ofte i applikationer, der administrerer, vedligeholder eller manipulerer samlinger af objekter, der er forskellige, men samtidig har mange egenskaber (dvs.metoder og egenskaber) til fælles. Et eksempel kan være en samling af dokumenter med en blanding af PDF-dokumenter, Pdf-dokumenter og RTF-dokumenter.
Diagram
deltagere
- Creator — in sample code: Fabrik
- objektet ‘fabrik’, der opretter nye produkter
- implementerer ‘factoryMethod’, der returnerer nyoprettede produkter
- AbstractProduct — not used in JavaScript
- erklærer en grænseflade for produkter
- Concreteprodukt — in sample code: medarbejdere
- produktet oprettes
- alle produkter understøtter den samme grænseflade (egenskaber og metoder)
prøvekode i JavaScript
i dette JavaScript-eksempel opretter fabriksobjektet fire forskellige typer medarbejdere. Hver medarbejdertype har en anden timepris. Createmedarbejdermetoden er den faktiske Fabriksmetode. Klienten instruerer fabrikken, hvilken type medarbejder der skal oprettes ved at overføre et typeargument til fabriksmetoden.
Abstractproduktet i diagrammet implementeres ikke, fordi Javascript ikke understøtter abstrakte klasser eller grænseflader. Vi skal dog stadig sikre, at alle medarbejdertyper har samme grænseflade (egenskaber og metoder).
Der oprettes fire forskellige medarbejdertyper; alle gemmes i samme array. Hver medarbejder bliver bedt om at sige, hvad de er, og deres timepris.
logfunktionen er en hjælper, der indsamler og viser resultater.
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