sammanfattning
en Fabriksmetod skapar nya objekt enligt instruktioner från klienten. Ett sätt att skapa objekt i JavaScript är att åberopa en konstruktörsfunktion med den nya operatören. Det finns dock situationer där klienten inte, eller inte borde, vet vilken av flera kandidatobjekt som ska instansieras. Fabriksmetoden gör det möjligt för klienten att delegera skapande av objekt samtidigt som man behåller kontrollen över vilken typ som ska instansieras.
huvudmålet med Fabriksmetoden är töjbarhet. Fabriksmetoder används ofta i applikationer som hanterar, underhåller eller manipulerar samlingar av objekt som är olika men samtidigt har många egenskaper (dvs. metoder och egenskaper) gemensamt. Ett exempel skulle vara en samling dokument med en blandning av Xml-dokument, Pdf-dokument och Rtf-dokument.
Diagram
deltagare
- skapare – i provkod: Factory
- objektet ’factory’ som skapar nya produkter
- implementerar ’factoryMethod’ som returnerar nyskapade produkter
- AbstractProduct-används inte i JavaScript
- förklarar ett gränssnitt för produkter
- ConcreteProduct-i exempelkod: anställda
- produkten skapas
- Alla produkter stöder samma gränssnitt (egenskaper och metoder)
exempelkod i JavaScript
i det här Javascript-exemplet skapar fabriksobjektet fyra olika typer av anställda. Varje anställd typ har en annan timpris. Metoden create employee är den faktiska Fabriksmetoden. Klienten instruerar fabriken vilken typ av anställd som ska skapas genom att skicka ett typargument till Fabriksmetoden.
Abstractprodukten i diagrammet implementeras inte eftersom Javascript inte stöder abstrakta klasser eller gränssnitt. Vi måste dock fortfarande se till att alla anställdstyper har samma gränssnitt (egenskaper och metoder).
fyra olika anställdstyper skapas; alla lagras i samma array. Varje anställd uppmanas att säga vad de är och deras timpris.
loggfunktionen är en hjälpare som samlar in och visar resultat.
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