팩토리 함수
Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 62번째.
이 코스 전반에 걸쳐, 여러분은 Circle:new(), Rectangle:new() 등과 같이 생성자를 직접 호출하여 객체를 생성해 왔습니다. 하지만 호출하는 코드에서 어떤 구체적인 클래스를 사용해야 하는지 알 필요 없이, 어떤 조건에 따라 서로 다른 유형의 객체를 생성하고 싶다면 어떨까요?
이것이 바로 팩토리 패턴(Factory pattern)이 등장하는 지점입니다. 팩토리는 단순히 객체를 생성하고 반환하는 함수입니다. 주요 장점은 호출자가 객체 생성의 세부 사항을 알 필요가 없다는 것입니다. 호출자는 단지 팩토리에 필요한 것을 요청하기만 하면 됩니다.
local function createShape(shapeType)
if shapeType == "circle" then
return Circle:new(10)
elseif shapeType == "square" then
return Square:new(5)
end
end
-- 호출자는 Circle 또는 Square 클래스에 대해 알 필요가 없습니다.
local myShape = createShape("circle")
print(myShape:area())
팩토리 함수는 문자열 인자를 받아 어떤 클래스를 인스턴스화할지 결정합니다. 이는 객체 생성 로직을 한 곳으로 중앙 집중화합니다. 나중에 새로운 도형 타입을 추가하더라도, 도형을 생성하는 모든 코드를 수정할 필요 없이 팩토리만 수정하면 됩니다.
팩토리는 객체 생성이 복잡한 설정을 포함하거나, 구현 세부 사항을 숨기고 싶을 때, 또는 객체의 정확한 타입이 사용자 입력이나 설정 파일과 같은 런타임 조건에 따라 달라질 때 특히 유용합니다.
챌린지
쉬움펫 팩토리(Pet Factory)를 만들어 봅시다! 각 클래스의 생성자를 직접 호출하여 펫을 생성하는 대신, 간단한 문자열 인수를 기반으로 적절한 유형의 펫을 생성하는 팩토리 함수를 만들 것입니다.
코드는 다음 네 개의 파일로 구성됩니다:
Dog.lua: 펫의 이름을 저장하는:new(name)생성자를 가진 Dog 클래스를 만듭니다."{name} says: Woof!"({name}은 강아지의 이름) 문자열을 반환하는:speak()메서드를 추가합니다.Cat.lua: 동일한 구조를 가진 Cat 클래스를 만듭니다.:new(name)생성자와"{name} says: Meow!"를 반환하는:speak()메서드를 포함합니다.PetFactory.lua: 이곳이 팩토리 패턴이 빛을 발하는 곳입니다! 두 개의 인수, 즉 펫 유형을 나타내는 문자열("dog"또는"cat")과 펫의 이름을 받는createPet(petType, name)함수를 만듭니다. 이 함수는 적절한 펫 객체를 반환해야 합니다. 유형이"dog"이면 새로운 Dog를 반환하고,"cat"이면 새로운 Cat을 반환합니다.main.lua: PetFactory 모듈을 불러옵니다(require). 펫 유형과 펫 이름이라는 두 개의 입력을 읽습니다. 팩토리 함수를 사용하여 펫을 생성한 다음, 해당 펫의:speak()메서드를 호출하고 결과를 출력합니다.
팩토리 패턴의 장점은 메인 코드가 Dog나 Cat을 직접 불러올 필요가 없다는 것입니다. 메인 코드는 오직 팩토리만 알면 됩니다. 팩토리가 어떤 클래스를 인스턴스화할지에 대한 모든 세부 사항을 처리합니다.
두 개의 입력을 받게 됩니다:
- 펫 유형 (
"dog"또는"cat"중 하나) - 펫 이름 (문자열)
예를 들어, 입력이 dog와 Buddy라면 출력은 다음과 같아야 합니다:
Buddy says: Woof!입력이 cat과 Whiskers라면 출력은 다음과 같아야 합니다:
Whiskers says: Meow!치트 시트
팩토리 패턴(Factory pattern)은 함수가 주어진 매개변수를 기반으로 객체를 생성하고 반환하는 디자인 패턴입니다. 호출자는 어떤 특정 클래스가 인스턴스화되는지 알 필요가 없으며, 팩토리가 그 결정을 처리합니다.
팩토리 함수는 객체 생성 로직을 중앙 집중화합니다:
local function createShape(shapeType)
if shapeType == "circle" then
return Circle:new(10)
elseif shapeType == "square" then
return Square:new(5)
end
end
local myShape = createShape("circle")
print(myShape:area())
팩토리 패턴의 장점:
- 호출자로부터 구현 세부 사항을 숨깁니다
- 객체 생성을 한 곳으로 중앙 집중화합니다
- 새로운 타입을 추가하기 쉽습니다. 팩토리만 수정하면 됩니다.
- 객체 타입이 런타임 조건(사용자 입력, 설정 등)에 따라 달라질 때 유용합니다
- 객체 생성에 복잡한 설정이 포함될 때 도움이 됩니다
직접 해보기
-- main.lua
-- PetFactory를 사용하여 펫을 생성합니다
local PetFactory = require('PetFactory')
-- 입력 읽기
local petType = io.read()
local petName = io.read()
-- TODO: PetFactory.createPet을 사용하여 펫을 생성하세요
-- TODO: 펫의 :speak() 메서드를 호출하고 결과를 출력하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.