팩토리 패턴은 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를 사용한다.