Summary
Tehdasmenetelmä luo uusia objekteja asiakkaan ohjeiden mukaisesti. Yksi tapa luoda objekteja JavaScript on vetoamalla constructor toiminto uuden operaattorin. On kuitenkin tilanteita, joissa asiakas ei tiedä tai hänen ei pitäisi tietää, kuka useista ehdokkaista vastustaa instantiointia. Tehdasmenetelmän avulla asiakas voi delegoida objektin luomisen säilyttäen kuitenkin kontrollin siitä, minkä tyypin asentaa.
Tehdasmenetelmän keskeinen tavoite on laajennettavuus. Tehdasmenetelmiä käytetään usein sovelluksissa, joissa hallitaan, ylläpidetään tai manipuloidaan erilaisia, mutta samalla monia yhteisiä ominaisuuksia (eli menetelmiä ja ominaisuuksia) sisältäviä objektikokoelmia. Esimerkki olisi kokoelma asiakirjoja, joissa on sekoitus Xml-dokumentteja, Pdf-dokumentteja ja Rtf-dokumentteja.
kaavio
osallistujat
- luoja — otoskoodissa: Tehdas
- ”tehdas” – olio, joka luo uusia tuotteita
- toteuttaa ”factoryMethod” – olion, joka palauttaa uudet tuotteet
- AbstractProduct — not used in JavaScript
- Konkretiaproduct — in sample code: Employees
- tuotettava tuote
- kaikki tuotteet tukevat samaa rajapintaa (ominaisuudet ja menetelmät)
esimerkkikoodi javascriptissä
tässä JavaScript-esimerkissä tehdasolio luo neljä erityyppistä työntekijää. Jokaisella työntekijätyypillä on erilainen tuntipalkka. Create employee-menetelmä on varsinainen Tehdasmenetelmä. Asiakas ohjeistaa tehdasta minkälaisen työntekijän luo siirtämällä Tyyppiargumentin Tehdasmenetelmään.
kaavion AbstractProduct ei ole toteutettu, koska Javascript ei tue abstrakteja luokkia tai rajapintoja. Meidän on kuitenkin edelleen varmistettava, että kaikilla työntekijätyypeillä on sama rajapinta (ominaisuudet ja menetelmät).
luodaan neljä eri työntekijätyyppiä; kaikki tallennetaan samaan joukkoon. Jokaista työntekijää pyydetään kertomaan, mitä he ovat ja heidän tuntipalkkansa.
lokifunktio on apulainen, joka kerää ja näyttää tuloksia.
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