factory pattern

김대익·2022년 3월 29일
0


팩토리 패턴은 enum처럼 사용하는데,
객체가 여러개라 복잡할 경우 편하게 객체를 선택해 만들어주는 함수를 만드는 패턴이다.

from enum import Enum
class AnimalEnum(Enum):
  CAT = 1
  DOG = 2

class Animal():
  def speak(self):
    pass

class Cat(Animal):
  def speak(self):
    print("meow")

class Dog(Animal):
  def speak(self):
    print("bark")
    

위와 같이 Cat, Dog 클래스가 있을 때 Enum class를 이용해 간편하게 선택할 수 있게 하여

#Factory function
#prefer enum
def FactoryFn(animal:AnimalEnum):
  if animal == AnimalEnum.CAT:
    return Cat()
  elif animal == AnimalEnum.DOG:
    return Dog()


cat = FactoryFn(AnimalEnum.CAT)
cat.speak()
dog = FactoryFn(AnimalEnum.DOG)
dog.speak()

FactoryFn 함수에서 Enum값을 이용해 편하게 객체를 생성하게 만들어준다.

자바스크립트에서 이 패턴의 예를 들면

function Developer(name)
{
  this.name = name
  this.type = "Developer"
}

function Tester(name)
{
  this.name = name
  this.type = "Tester"
}

function EmployeeFactory()
{
  this.create = (name, type) => {
    switch(type)
    {
      case 1:
        return new Developer(name)
      case 2:
        return new Tester(name)
    }
  }
}

function say()
{
  console.log("Hi, I am " + this.name + " and I am a " + this.type)
}

const employeeFactory = new EmployeeFactory()
const employees = []

employees.push(employeeFactory.create("Patrick", 1))
employees.push(employeeFactory.create("John", 2))
employees.push(employeeFactory.create("Jamie", 1))
employees.push(employeeFactory.create("Taylor", 1))
employees.push(employeeFactory.create("Tim", 2))

employees.forEach( emp => {
  say.call(emp)
})

Developer, Tester 클래스를 만들고
EmployeeFactory에서 switch case문을 이용하여 객체를 리턴한다.

참고로 JS에서 객체를 만드는 방법은

var obj = {
    name: "kim",
    getName: function () {
        console.log(this.name);
    }
};

처럼 {}을 사용하거나,

function Person(name) {
    this.name = name;
    this.showName = function () {
        console.log(`My name is ${this.name}`);
    };
}

var person = new Person("Son");
person.showName();

new를 사용하는 것이다.
두 가지 모두 내부적으로는 거의 비슷한데 다른 점은 new에서는 this를 사용한다는 것이다.

new Person("Son");이 실행되면

Person함수에 빈 객체({ })가 생성되고,

this.name = name;에서 this는 이 빈 객체를 가리킨다
따라서 객체 안에 {name = "Son"}이 들어가게 된다.

Person 함수의 모든 내용이 실행됐다면
this를 return하기 때문에
var person = new Person("Son");은 리턴받은 값을 person 변수에 저장하는 것이다.

객체를 재사용할 필요가 있을 때 {}이 아닌 new를 사용한다.

0개의 댓글