추상팩토리(Abstractfactory) 패턴

목적

객체 생성에 관련된 패턴입니다.
서로 관련성이 있는 다양한 객체를 생성하기 위한 인터페이스를 제공하는 패턴입니다.

구조

설명

  • AbstractFatory : Product 생성하기 위한 인터페이스만 정의 (Javascript 에서는 사용하지 않음)
  • ConcreateFactory : creatProduct() 로 새로운 product 를 return 해준다
  • Product : Factory 에 의해서 생성되는 product
  • AbstractProduct : product 의 인터페이스 (Javascript 에서는 사용하지 않음)

코드 sample 1

  • ConcreateFactory : EmployeeFactory, VendorFactory
  • Product : Employee, Vendor
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    function Employee(name) {
    this.name = name;

    this.say = function () {
    log.add("I am employee " + name);
    };
    }

    function EmployeeFactory() {
    this.create = function(name) {
    return new Employee(name);
    };
    }

    function Vendor(name) {
    this.name = name;

    this.say = function () {
    log.add("I am vendor " + name);
    };
    }

    function VendorFactory() {

    this.create = function(name) {
    return new Vendor(name);
    };
    }

    // log helper
    var log = (function () {
    var log = "";

    return {
    add: function (msg) { log += msg + "\n"; },
    show: function () { alert(log); log = ""; }
    }
    })();

    function run() {
    var persons = [];
    var employeeFactory = new EmployeeFactory();
    var vendorFactory = new VendorFactory();

    persons.push(employeeFactory.create("Kim"));
    persons.push(employeeFactory.create("Lee"));
    persons.push(vendorFactory.create("Samsung"));
    persons.push(vendorFactory.create("LG"));

    for (var i = 0, len = persons.length; i < len; i++) {
    persons[i].say();
    }

    log.show();
    }

코드 sample 2

  • ConcreateFactory : vehicleFactory
  • Product : Car, Truck, Bike
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function Car() { this.name = "Car"; this.wheels = 4; }
    function Truck() { this.name = "Truck"; this.wheels = 6; }
    function Bike() { this.name = "Bike"; this.wheels = 2; }

    const vehicleFactory = {
    createVehicle: function (type) {
    switch (type.toLowerCase()) {
    case "car":
    return new Car();
    case "truck":
    return new Truck();
    case "bike":
    return new Bike();
    default:
    return null;
    }
    }
    };

    const car = vehicleFactory.createVehicle("Car"); // Car { name: "Car", wheels: 4 }
    const truck = vehicleFactory.createVehicle("Truck"); // Truck { name: "Truck", wheels: 6 }
    const bike = vehicleFactory.createVehicle("Bike"); // Bike { name: "Bike", wheels: 2 }
    const unknown = vehicleFactory.createVehicle("Boat"); // null ( Vehicle not known )

참조사이트

  • dofactory