A A
[Design Pattern] Factory Pattern - νŒ©ν† λ¦¬ νŒ¨ν„΄

Creation Design Pattern (생성 λ””μžμΈ νŒ¨ν„΄)

  • 생성 λ””μžμΈ νŒ¨ν„΄μ€ 객체 생성에 κ΄€λ ¨λœ λ””μžμΈ νŒ¨ν„΄μ„ λ§ν•©λ‹ˆλ‹€.
  • 이 νŒ¨ν„΄λ“€μ€ 객체의 생성 과정을 μΊ‘μŠν™”ν•˜μ—¬, 객체 생성을 더 μœ μ—°ν•˜κ²Œ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€.
  • 주둜 객체 생성 둜직이 λ‹¨μˆœν•˜μ§€ μ•Šκ±°λ‚˜, 객체 생성과 κ΄€λ ¨λœ 정보λ₯Ό μΊ‘μŠν™”ν•˜μ—¬, μ‹œμŠ€ν…œμ˜ λ‹€λ₯Έ λΆ€λΆ„κ³Όμ˜ μ˜μ‘΄μ„±μ„ μ€„μ΄λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.

Factory Pattern (νŒ©ν† λ¦¬ νŒ¨ν„΄)

νŒ©ν† λ¦¬ νŒ¨ν„΄μ€ 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜κ³ , μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν• μ§€λŠ” μ„œλΈŒν΄λž˜μŠ€κ°€ κ²°μ •ν•˜κ²Œ ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 객체 생성을 μœ„ν•œ μ½”λ“œμ™€ μ‚¬μš©μ„ μœ„ν•œ μ½”λ“œμ˜ 뢄리가 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€. νŒ©ν† λ¦¬ νŒ¨ν„΄μ€ 크게 μ„Έ κ°€μ§€λ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

 

Simple Factory (λ‹¨μˆœ νŒ©ν† λ¦¬)

  • λ‹¨μˆœ νŒ©ν† λ¦¬λŠ” νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό 가진 클래슀λ₯Ό 톡해 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이 방식은 λ‹¨μˆœν•˜μ§€λ§Œ, μœ μ—°μ„±μ΄ λ‹€μ†Œ λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

Factory Method (νŒ©ν† λ¦¬ λ©”μ†Œλ“œ)

  • νŒ©ν† λ¦¬ λ©”μ†Œλ“œλŠ” 객체λ₯Ό 생성할 λ•Œ ν•„μš”ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜κ³ , μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν• μ§€λŠ” μ„œλΈŒν΄λž˜μŠ€κ°€ κ²°μ •ν•˜κ²Œ ν•©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ™€ μΈμŠ€ν„΄μŠ€ 생성을 λΆ„λ¦¬ν•˜μ—¬ 각각의 μ„œλΈŒν΄λž˜μŠ€μ—μ„œ μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할지 κ²°μ •ν•©λ‹ˆλ‹€.

Abstract Factory (좔상 νŒ©ν† λ¦¬)

  • 좔상 νŒ©ν† λ¦¬λŠ” κ΄€λ ¨λœ μ—¬λŸ¬ μ’…λ₯˜μ˜ 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 이 νŒ¨ν„΄μ€ μ„œλ‘œ κ΄€λ ¨λœ μ—¬λŸ¬ 객체ꡰ을 생성해야 ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€. 좔상 νŒ©ν† λ¦¬ νŒ¨ν„΄μ€ μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•˜λŠ” ν΄λž˜μŠ€λ“€ μ‚¬μ΄μ˜ 일관성을 μœ μ§€ν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€.

Builder Pattern (λΉŒλ” νŒ¨ν„΄)

  • λΉŒλ” νŒ¨ν„΄μ€ λ³΅μž‘ν•œ 객체의 생성 κ³Όμ •κ³Ό ν‘œν˜„ 방법을 λΆ„λ¦¬ν•¨μœΌλ‘œμ¨, λ™μΌν•œ 생성 κ³Όμ •μ—μ„œ μ„œλ‘œ λ‹€λ₯Έ ν‘œν˜„ κ²°κ³Όλ₯Ό 생성할 수 있게 ν•΄μ€λ‹ˆλ‹€.
  • 이 νŒ¨ν„΄μ€ λ³΅μž‘ν•œ 객체λ₯Ό λ‹¨κ³„λ³„λ‘œ 생성할 λ•Œ μœ μš©ν•˜λ©°, μ΅œμ’…μ μœΌλ‘œ μƒμ„±λ˜λŠ” 객체의 νƒ€μž…μ€ κ°™μ§€λ§Œ, ꡬ성 μš”μ†Œλ‚˜ ꡬ성 방법이 λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

Singleton (μ‹±κΈ€ν„΄)

  • μ‹±κΈ€ν„΄ νŒ¨ν„΄μ€ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ 단 ν•˜λ‚˜λ§Œ μƒμ„±λ˜λ„λ‘ 보μž₯ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€.
  • μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  객체에 λŒ€ν•œ μ „μ—­ 접근점을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • 이 νŒ¨ν„΄μ€ λ‘œκΉ…, λ“œλΌμ΄λ²„ 객체, λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°κ³Ό 같이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ „λ°˜μ— 걸쳐 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ ν•„μš”ν•œ κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€.

Prototype (ν”„λ‘œν† νƒ€μž…)

  • ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄μ€ 생성할 객체의 νƒ€μž…μ΄ ν”„λ‘œν† νƒ€μž…μœΌλ‘œλΆ€ν„° ν΄λ‘ λ˜μ–΄μ•Ό ν•˜λŠ” 경우 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 즉, μƒˆλ‘œμš΄ 객체λ₯Ό 생성할 λ•Œλ§ˆλ‹€ ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” λŒ€μ‹ , κΈ°μ‘΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ³΅μ‚¬ν•˜μ—¬ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • 이 방법은 λ³΅μž‘ν•œ 객체λ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œ 초기 섀정이 많이 ν•„μš”ν•œ κ²½μš°μ— νš¨κ³Όμ μž…λ‹ˆλ‹€.


(Simple) Factory Pattern

  • Simple Factory Pattern은 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ λ‹€λ₯Έ 클래슀의 객체λ₯Ό μƒμ„±ν•˜λŠ” 클래슀λ₯Ό μ§€μΉ­ν•©λ‹ˆλ‹€.
  • 이 νŒ¨ν„΄μ€ κ°μ²΄μ˜ 생성을 λ³„λ„μ˜ 클래슀둜 μΊ‘μŠν™”ν•˜μ—¬, κ°μ²΄ 생성 과정을 감좔고 ν΄λΌμ΄μ–ΈνŠΈμ—κ²ŒλŠ” λ‹¨μˆœν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•

  • 객체 생성 μΊ‘μŠν™”: FactoryλŠ” 객체의 생성을 λ³„λ„μ˜ 클래슀둜 μΊ‘μŠν™”ν•©λ‹ˆλ‹€. μ΄λŠ” 객체 생성 λ‘œμ§μ„ 단일 μœ„μΉ˜μ— μ§‘μ€‘μ‹œν‚€κ³ , ν΄λΌμ΄μ–ΈνŠΈμ—κ²ŒλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜μ—¬ 객체λ₯Ό μš”μ²­ν•  수 있게 ν•©λ‹ˆλ‹€.
  • 일반적으둜 λ©”μ„œλ“œλ‘œ ꡬ성: Factory ν΄λž˜μŠ€λŠ” 주둜 객체와 κ΄€λ ¨λœ λ©”μ„œλ“œλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€. 이 λ©”μ„œλ“œλŠ” νŠΉμ • 인자λ₯Ό λ°›μ•„λ“€μ—¬ ν•΄λ‹Ήν•˜λŠ” 객체λ₯Ό μƒμ„±ν•˜κ³  λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈ-νŒ©ν† λ¦¬ μƒν˜Έμž‘μš©: ν΄λΌμ΄μ–ΈνŠΈλŠ” νŠΉμ • μΈμžμ™€ ν•¨κ»˜ νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ ν•„μš”ν•œ 객체λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€. 이후 νŒ©ν† λ¦¬λŠ” ν•΄λ‹Ή 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.

Factory Pattern

Factory νŒ¨ν„΄μ€ 객체 생성을 μΆ”μƒν™”ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ νŠΉμ • 객체의 μΈμŠ€ν„΄μŠ€λ₯Ό 직접 μƒμ„±ν•˜λŠ” λŒ€μ‹ , νŒ©ν† λ¦¬μ—κ²Œ 객체λ₯Ό μƒμ„±ν•˜λ„λ‘ μš”μ²­ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€.

 

Factory νŒ¨ν„΄μ€ 객체 생성을 μΆ”μƒν™”ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ νŠΉμ • 객체의 μΈμŠ€ν„΄μŠ€λ₯Ό 직접 μƒμ„±ν•˜λŠ” λŒ€μ‹ , νŒ©ν† λ¦¬μ—κ²Œ 객체λ₯Ό μƒμ„±ν•˜λ„λ‘ μš”μ²­ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€.

  • 곡μž₯은 ν•¨μˆ˜ λ˜λŠ” 클래슀둜 λ‚˜νƒ€λ‚Ό 수 있음: FactoryλŠ” ν•¨μˆ˜λ‚˜ 클래슀둜 κ΅¬ν˜„λ  수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•  경우, ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ 인자λ₯Ό λ°›μ•„λ“€μ—¬ ν•΄λ‹Ήν•˜λŠ” 객체λ₯Ό μƒμ„±ν•˜κ³  λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ›ν•˜λŠ” 물건을 λ§Œλ“€μ–΄ 달라고 μš”μ²­ν•˜λ©΄ κ·Έ μ œν’ˆμ„ λ§Œλ“€μ–΄ λ‚Ό 수 있음: ν΄λΌμ΄μ–ΈνŠΈλŠ” νŒ©ν† λ¦¬μ—κ²Œ νŠΉμ • 객체의 생성을 μš”μ²­ν•©λ‹ˆλ‹€.


Factory Pattern Example1 - ν•¨μˆ˜λ‘œ ν‘œν˜„

  • μ œν’ˆ μ •μ˜
class Robot:
	def speak(self):
		pass
	
class Cat(Robot):
	def speak(self):
        print("Meow")

class Dog(Robot):
    def speak(self):
        print("Bark")
  • 곡μž₯
class factoryFunc(animal):
    if animal_type == "cat":
        return Cat()
    elif animal_type == "dog":
        return Dog()
  • Client
cat = factoryFunc("cat")
dog = factoryFunc("dog")

cat.speak()
dog.speak()

 


Factory Pattern Example2 - ν•¨μˆ˜λ‘œ ν‘œν˜„

  • μ œν’ˆ μ •μ˜
class Car:
	def drive(self):
		return "car driving"
	
class Truck:
	def drive(self):
       return "truck driving"

class Motorcycle:
    def drive(self):
       return "motorcycle zooming"
  • 곡μž₯
class VehicleFactory:
    def get_vehicle(self, vehicle_type):
        if vehicle_type == "car":
            return Car()
        elif vehicle_type == "truck":
            return Truck()
        elif vehicle_type == "motorcycle":
            return Motorcycle()
        else:
            return ValueError("Unknown vehicle type")
  • Client μš”μ²­
factory = VehicleFactory()

car = factory.get_vehicle("car")
print(car.drive()) # car driving

truck = factory.get_vehicle("truck")
print(truck.drive()) # truck driving

motorcycle = factory.get_vehicle("motorcycle")
print(motorcycle.drive()) # motorcycle zooming

Class둜 ν‘œν˜„μ‹œ enum을 ν™œμš©ν•˜λ©΄ νŽΈλ¦¬ν•¨
from enum import Enum

class RobotEnum(Enum):
    Cat = 0
    Dog = 1

class Robot:
    def speak(self):
        pass

class Cat(Robot):
    def speak(self):
        print("Meow")

class Dog(Robot):
    def speak(self):
        print("Bark")
        
class RobotFactory:

    def makeRobot(self, robot:RobotEnum):
        if robot == RobotEnum.CAT:
            return Cat()
        elif robot == RobotEnum.DOG:
            return Dog()

fac1 = RobotFactory()
dog = fac1.makeRobot(RobotEnum.DOG)
dog.speak()
cat = fac1.makeRobot(RobotEnum.CAT)
cat.speak()
UML둜 ν‘œν˜„


Factroy Pattern

  • Factory νŒ¨ν„΄μ€ μ‚¬μš©μžκ°€ 였브젝트의 생성 과정을 직접 λ‹€λ£° ν•„μš” μ—†κ²Œλ” ν•΄μ£ΌλŠ” μ€‘μš”ν•œ λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 λ³΅μž‘ν•œ 객체의 생성 과정을 숨기고, ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹¨μˆœνžˆ "고양이"λ‚˜ "강아지"와 같은 μš”μ²­λ§Œμ„ ν•  수 있게 λ©λ‹ˆλ‹€.
  • μ—¬κΈ°μ„œ κ°•μ•„μ§€λ‚˜ 고양이 μ˜ˆμ‹œλŠ” λ‹¨μˆœν•œ 예일 뿐이며, μ‹€μ œλ‘œλŠ” 객체 생성 과정이 훨씬 더 λ³΅μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, νŠΉμ •ν•œ μ’…λ₯˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 객체λ₯Ό μƒμ„±ν•˜κ±°λ‚˜, λ„€νŠΈμ›Œν¬ 톡신을 μœ„ν•œ 인증 객체λ₯Ό μƒμ„±ν•˜λŠ” λ“±μ˜ λ³΅μž‘ν•œ μž‘μ—…μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λŸ¬ν•œ λ³΅μž‘ν•œ 생성 과정을 νŒ©ν† λ¦¬ μ•ˆμ— μˆ¨κ²¨λ‘κ³ , ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹¨μˆœν•œ μš”μ²­μ„ ν•  λ•Œ ν•„μš”ν•œ κ°μ²΄λ§Œμ„ μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” 것이 νŒ©ν† λ¦¬ νŒ¨ν„΄μ˜ 핡심 κ°œλ…μž…λ‹ˆλ‹€.
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ˜€λΈŒμ νŠΈμ˜ 생성에 λŒ€ν•΄ κ±±μ •ν•  ν•„μš” 없이, λ‹¨μˆœνžˆ νŒ©ν† λ¦¬μ—κ²Œ ν•„μš”ν•œ 였브젝트λ₯Ό μš”μ²­ν•˜λ©΄ λ©λ‹ˆλ‹€. νŒ©ν† λ¦¬λŠ” λ‚΄λΆ€μ μœΌλ‘œ λ³΅μž‘ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μš”μ²­ν•œ 였브젝트λ₯Ό λ°˜ν™˜ν•˜λŠ” κ°œλ…μž…λ‹ˆλ‹€.
Summary: Factory Pattern은 Factory Method Pattern, Singleton Pattern, Builder pattern μ—μ„œ μ‘μš©μ΄ λ©λ‹ˆλ‹€.