팩토리 함수
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 62번째.
이 과정 전체에서 지금까지는 생성자를 직접 호출하여 객체를 만들었습니다: Circle:new(), Rectangle:new() 등입니다. 하지만 호출하는 코드가 어떤 특정 클래스를 사용해야 하는지 알 필요 없이, 어떤 조건에 따라 서로 다른 유형의 객체를 만들고 싶다면 어떻게 해야 할까요?
여기서 Factory pattern이 등장합니다. Factory는 단순히 object를 생성하고 반환하는 function입니다. 핵심 이점은 caller가 object 생성의 세부 사항을 알 필요가 없다는 것입니다. caller는 단지 Factory에 자신에게 필요한 것을 요청하면 됩니다.
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())
팩토리 function은 문자열 인수를 받아 어떤 class를 인스턴스화할지 결정합니다. 이를 통해 object 생성 로직을 한곳에 중앙화할 수 있습니다. 나중에 새로운 도형 유형을 추가하더라도 도형을 create하는 모든 코드가 아니라 팩토리만 수정하면 됩니다.
팩토리는 object 생성에 복잡한 설정이 포함되거나, 구현 세부 정보를 숨기고 싶을 때, 또는 object의 정확한 유형이 사용자 입력이나 구성 파일과 같은 런타임 조건에 따라 달라질 때 특히 유용합니다.
챌린지
쉬움Pet Factory를 만들어 봅시다! 각 클래스의 constructor를 호출하여 pet을 직접 만드는 대신, 간단한 문자열 인수를 기반으로 올바른 유형의 pet을 생성하는 factory function을 만들 것입니다.
코드를 네 개의 파일로 구성합니다:
Dog.lua: pet의 이름을 저장하는:new(name)constructor를 포함한 Dog class를 만듭니다."{name} says: Woof!"문자열을 반환하는:speak()method를 추가합니다({name}은 강아지의 이름입니다).Cat.lua: 동일한 구조의 Cat class를 만듭니다.:new(name)constructor와"{name} says: Meow!"을 반환하는:speak()method를 포함합니다.PetFactory.lua: 여기서 Factory pattern의 진가가 드러납니다! 두 개의 인수를 받는createPet(petType, name)function을 만듭니다. 인수는 pet 유형을 나타내는 문자열("dog"또는"cat")과 pet의 이름입니다. function은 적절한 pet object를 반환해야 합니다. 유형이"dog"이면 새로운 Dog를 반환하고,"cat"이면 새로운 Cat을 반환합니다.main.lua: PetFactory module을 require합니다. 두 개의 입력, 즉 pet 유형과 pet의 이름을 읽습니다. factory function을 사용하여 pet을 만든 다음, 해당 pet의:speak()method를 호출하고 result를 print합니다.
Factory pattern의 장점은 main 코드에서 Dog 또는 Cat을 직접 require할 필요가 없다는 것입니다. main 코드는 factory에 대해서만 know합니다. 어떤 class를 instantiate할지는 factory가 모든 세부 사항을 처리합니다.
두 개의 입력을 받습니다:
- Pet 유형(
"dog"또는"cat"중 하나) - Pet 이름(문자열)
예를 들어 inputs가 dog와 Buddy라면 output은 다음과 같아야 합니다:
Buddy says: Woof!inputs가 cat과 Whiskers라면 output은 다음과 같아야 합니다:
Whiskers says: Meow!직접 해보기
-- main.lua
-- PetFactory를 사용하여 펫을 생성합니다
local PetFactory = require('PetFactory')
-- 입력을 읽습니다
local petType = io.read()
local petName = io.read()
-- TODO: PetFactory.createPet을 사용하여 펫을 생성하세요
-- TODO: 펫의 :speak() 메서드를 호출하고 결과를 출력하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러