Factory Method (Creational Patterns)

Definition

Khai báo 1 interface để tạo 1 object, nhưng sẽ để những class con xác định class để khởi tạo. Factory Method cho phép 1 class chuyển class để khởi tạo.

Tần suất sử dụng trong JavaScript: 4/5 (medium high)

Summary

...

Diagram

Participants

Các thành phần tham gia pattern này gồm có:

  • Creator -- In sample code: Factory
    • 'factory' object để tạo nhiều product
    • chạy 'factoryMethod' sẽ trả về các product được tạo mới
  • AbstractProduct -- not used in JavaScript
    • khởi tạo 1 interface cho product
  • ConcreteProduct -- In sample code: Employees
    • product sẽ được khởi tạo
    • tất cả product sẽ hỗ trợ 1 interface giống nhau (properties and methods)

Sample code in JavaScript

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 helper
var 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 < len; i++) {
        employees[i].say();
    }
 
    log.show();
}

http://www.dofactory.com/javascript/factory-method-design-pattern