Sammendrag
En Fabrikkmetode oppretter nye objekter som instruert av klienten. En måte å lage objekter i JavaScript er ved å påkalle en konstruktørfunksjon med den nye operatøren. Det finnes imidlertid situasjoner der klienten ikke, eller bør ikke, vet hvilken av flere kandidat objekter å instantiate. Fabrikkmetoden tillater klienten å delegere objektopprettelse samtidig som den beholder kontrollen over hvilken type som skal startes.
hovedmålet Med Fabrikkmetoden er utvidbarhet. Fabrikkmetoder brukes ofte i programmer som administrerer, vedlikeholder eller manipulerer samlinger av objekter som er forskjellige, men samtidig har mange egenskaper (dvs.metoder og egenskaper) til felles. Et eksempel kan være en samling av dokumenter med En blanding Av Xml-dokumenter, Pdf-dokumenter og Rtf-dokumenter.
Diagram
Deltakere
- Creator – i eksempelkode: Factory
- fabrikken ‘objekt som skaper nye produkter
- implementerer’ factoryMethod ‘som returnerer nyopprettede produkter
- AbstractProduct — ikke brukt I JavaScript
- erklærer et grensesnitt for produkter
- ConcreteProduct — i eksempelkode: Ansatte
- produktet blir opprettet
- alle produkter støtter det samme grensesnittet (egenskaper og metoder)
eksempelkode i javascript
i dette javascript-eksemplet oppretter fabrikkobjektet fire forskjellige typer ansatte. Hver ansatt type har en annen timepris. CreateEmployee-metoden er Den faktiske Fabrikkmetoden. Klienten instruerer fabrikken hvilken type ansatt som skal opprettes ved å sende et typeargument til Fabrikkmetoden.
Abstraktproduktet i diagrammet er ikke implementert fordi Javascript ikke støtter abstrakte klasser eller grensesnitt. Vi må imidlertid fortsatt sørge for at alle ansatttyper har samme grensesnitt (egenskaper og metoder).
Fire forskjellige ansatttyper opprettes; alle lagres i samme matrise. Hver ansatt blir bedt om å si hva de er og deres timepris.
loggfunksjonen er en hjelper som samler 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