shrnutí
tovární metoda vytváří nové objekty podle pokynů klienta. Jedním ze způsobů, jak vytvořit objekty v JavaScriptu, je vyvolání funkce konstruktoru u nového operátora. Existují však situace, kdy klient neví nebo by neměl vědět, který z několika kandidátských objektů má vytvořit instanci. Tovární metoda umožňuje klientovi delegovat vytváření objektů při zachování kontroly nad tím, jaký typ chcete vytvořit.
klíčovým cílem tovární metody je rozšiřitelnost. Tovární metody se často používají v aplikacích, které spravují, udržují nebo manipulují se sbírkami objektů, které jsou odlišné, ale zároveň mají mnoho společných vlastností (tj. Příkladem může být sbírka dokumentů se směsí dokumentů Xml, dokumentů Pdf a dokumentů Rtf.
Schéma
Účastníci
- Tvůrce-V ukázkový kód: Továrna
- ‚továrna‘ objekt, který vytváří nové produkty
- realizuje se factoryMethod‘, která vrátí nově vytvořené produkty
- AbstractProduct-není použit v Javascriptu
- deklaruje rozhraní pro produkty
- ConcreteProduct-V ukázkový kód: Zaměstnanci
- výrobek je vytvořen
- všechny produkty podporují stejné rozhraní (vlastnosti a metody)
Ukázkový kód v Javascriptu
V tomto JavaScript příklad Tovární objekt vytváří čtyři různé typy zaměstnanců. Každý typ zaměstnance má jinou hodinovou sazbu. Metoda createEmployee je skutečná tovární metoda. Klient instruuje továrnu, jaký typ zaměstnance vytvořit předáním argumentu typu do tovární metody.
AbstractProduct v diagramu není implementován, protože Javascript nepodporuje abstraktní třídy nebo rozhraní. Stále však musíme zajistit, aby všechny typy zaměstnanců měly stejné rozhraní (vlastnosti a metody).
jsou vytvořeny čtyři různé typy zaměstnanců; všechny jsou uloženy ve stejném poli. Každý zaměstnanec je požádán, aby řekl, co jsou a jejich hodinová sazba.
funkce protokolu je pomocník, který shromažďuje a zobrazuje výsledky.
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