λ°μν
Factory Method Pattern
ν©ν 리 λ©μλ ν¨ν΄μ μΈμ€ν΄μ€λ₯Ό μμ±νλ λ°©λ²μ μμ ν΄λμ€ μΈ‘μμ κ²°μ νμ§λ§, ꡬ체μ μΈ μΈμ€ν΄μ€μ μ νκΉμ§λ κ²°μ νμ§ μλ λμμΈ ν¨ν΄μ λλ€.
λμ , ꡬ체μ μΈ λ΄μ©μ λͺ¨λ νμ ν΄λμ€ μΈ‘μμ μνλ©λλ€. μ΄λ₯Ό ν΅ν΄ μΈμ€ν΄μ€ μμ±μ μν 골격과 μ€μ μΈμ€ν΄μ€ μμ±μ ν΄λμ€λ₯Ό λΆλ¦¬νμ¬ μκ°ν μ μμ΅λλ€.
- μμ ν΄λμ€μμ μΈμ€ν΄μ€ μμ± λ°©λ² κ²°μ : μμ ν΄λμ€μμλ μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν μΆμ λ©μλ(ν©ν 리 λ©μλ)λ₯Ό μ μν©λλ€.
- μ΄ λ©μλλ μ€μ λ‘ μ΄λ€ μ νμ μΈμ€ν΄μ€λ₯Ό μμ±ν μ§ κ²°μ νμ§ μκ³ , κ·Έ κ²°μ μ νμ ν΄λμ€μ μμλ©λλ€.
- νμ ν΄λμ€μμ ꡬ체μ μΈ λ΄μ© μν: μ€μ μΈμ€ν΄μ€ μμ±μ κ΄λ ¨λ ꡬ체μ μΈ λ‘μ§μ νμ ν΄λμ€μμ μνλ©λλ€.
- κ° νμ ν΄λμ€λ μμ ν΄λμ€μμ μ μλ μΆμ λ©μλλ₯Ό ꡬννμ¬ νμν μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€.
- ν΄λΌμ΄μΈνΈλ μ§μ μ μΈ μΈμ€ν΄μ€ μμ± κ³Όμ μ λν΄ μ κ²½ μ°μ§ μμ: ν΄λΌμ΄μΈνΈλ ν©ν 리 λ©μλλ₯Ό νΈμΆνμ¬ μνλ μ νμ κ°μ²΄λ₯Ό μμ±ν©λλ€.
- μ΄λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈλ μΈμ€ν΄μ€ μμ±μ λν 볡μ‘ν μΈλΆ λ΄μ©μ μ νμκ° μμΌλ©°, λ¨μν νμν κ°μ²΄λ₯Ό μμ²ν μ μμ΅λλ€.
- λν μ¬μ©μκ° μ€λΈμ νΈλ€μ μμ±κ³Όμ μ ν΄λΌμ΄μΈνΈκ° μ§μ λ€λ£° νμκ° μκ² λμμΌλ©°, μ€λΈμ νΈμ 볡μ‘ν μμ±κ³Όμ μ ν©ν 리μμ μ¨κ²¨λκ³ ν΄λΌμ΄μΈνΈλ “νΉμ μ νλ§ λ§λ€μ΄μ£ΌμΈμ” νλ©΄ νμν μ€λΈμ νΈλ§ λ§λ€μ΄μ 리ν΄ν΄μ€λ€λ κ°λ μ λλ€.
Factory Patternμ Factory Method Pattern, Singleton Pattern, Builder pattern μμ μμ©μ΄ λ©λλ€.
Class Diagram
Simple Factory Pattern
- μ΄ κΈμ Simple Factory Patternμ λ°νμ¬ μ€λͺ ν΄ λμμΌλ μ°Έκ³ ν΄μ£ΌμΈμ!
Factory Method Pattern
λμΌν μΈν°λ² μ΄μ€λ₯Ό μ΄μ©ν κ°κ²°ν μ½λ μμ μ λλ€.
# μ°¨λ μΈν°νμ΄μ€
class Vehicle:
def drive(self):
return "car driving"
# ꡬ체μ μΈ μ°¨λ ν΄λμ€
class Car(Vehicle):
def drive(self):
return "car driving"
class Truck(Vehicle):
def drive(self):
return "truck driving"
class Motorcycle(Vehicle):
def drive(self):
return "motorcycle zooming"
# ν©ν 리 μΈν°νμ΄μ€
class VehicleFactory:
def create_vehicle(self):
pass
# ꡬ체μ μΈ ν©ν 리 ν΄λμ€
class CarFactory(VehicleFactory):
def create_vehicle(self):
return Car()
class TruckFactory(VehicleFactory):
def create_vehicle(self):
return Truck()
class MotorcycleFactory(VehicleFactory):
def create_vehicle(self):
return Motorcycle()
# μ¬μ© μμ
def client_code(factory: VehicleFactory):
vehicle = factory.create_vehicle()
print(vehicle.drive())
car_factory = CarFactory()
client_code(car_factory)
truck_factory = TruckFactory()
client_code(truck_factory)
motorcycle_factory = MotorcycleFactory()
client_code(motorcycle_factory)
νΉνλ κΈ°λ₯μ κ°μ§λ μ¬λ¬ μ νμ μμ°νλ 곡μ₯ μ½λ μμμ λλ€.
# Robot Interface
class Robot:
def speak(self):
pass
class Cat(Robot):
def speak(self):
print("Meow")
class Dog(Robot):
def speak(self):
print("Bark")
# Factory Interface
class Factory():
def createRobot(self):
pass
class CatFactory(Factory):
def _init_(self):
self.cat_count = 0
def createRobot(self):
self.cat_count += 1
return Cat()
def catCount(self):
return self.cat_count
class DogFactory(Factory):
def haveDog(self):
self.dog = self.,createRobot()
def createRobot(self):
return Dog()
def addWing(self, dog:Dog):
print("dog wings added")
return dog
# μ¬μ© μμ
cat_factory = CatFactory()
cat1 = cat_factory.createRobot()
cat2 = cat_factory.createRobot()
print(cat_factory.catCount())
dog_factory = DogFactory()
dog1 = dog_factory.createRobot()
dog_Factory.addWing(dog1)
Factory Method Pattern (IDμΉ΄λ λ°κΈ μμ)
- Class Diagram
Implementation - Abstract Class
class Product:
def use(self):
pass
- μ νμ ννν ν΄λμ€, μΆμ Method useλ§μ΄ μ μΈλμ΄ μμ΅λλ€.
- μ¬κΈ°μ ꡬ체μ μΈ useλ ꡬ체 ν΄λμ€μκ² λ§‘κΉλλ€.
- μ¬κΈ°μ μ νμ΄λ? ‘무μμ΄λ useν μ μλκ²’ μΌλ‘ κ·μ νκ³ μμ΅λλ€.
class Factory:
def create(self, owner) -> Product:
p = self.create_product(owner)
self.register_product(p)
return p
# νμμμ ꡬνλ¨
def create_product(self, owner) -> Product:
pass
# νμμμ ꡬνλ¨
def register_product(self, product) -> None:
pass
- μ νμ λ§λ€κ³ (createProduct), λ§λ μ νμ λ±λ‘ (registerProduct)ν©λλ€.
- μ€μ§μ μΌλ‘ μ νμ λ§λ€κ³ , λ±λ‘νλ ꡬ체μ μΈ λ΄μ©μ νμν΄λμ€μμ μνν©λλ€.
- CreateMethod μμ μ νμ λ§λ€μ΄μ λ±λ‘νλ€λ μμλ‘ κ΅¬νλκ³ μμ΅λλ€.
- ꡬ체μ μΈ λ΄μ©μ Factory Method Patternμ μ μ©ν νλ‘κ·Έλ¨μ λ°λΌ λ€λ¦ λλ€.
Concrete Class
class IDCard(Product):
def __init__(self, owner):
print(owner + "μ μΉ΄λλ₯Ό λ§λλλ€.")
self.owner = owner
def use(self):
print(self.owner + "μ μΉ΄λλ₯Ό μ¬μ©ν©λλ€.")
def getOwner(self):
return self.owner
- μλ‘μ¨ μΈμμΉ΄λ λ²νΈλ₯Ό λνλ΄λ IDCard ν΄λμ€λ₯Ό μκ°ν΄ λ³Όμ μμ΅λλ€.
- Product ν΄λμ€μ νμ ν΄λμ€λ‘ μ μν©λλ€.
class IDCardFactory(Factory):
def __init__(self):
self.owners = [] # μΉ΄λ λ°κΈμ 리μ€νΈ
def create_product(self, owner) -> Product: # abstract method
return IDCard(owner)
def register_product(self, product): # abstract method
self.owners.append(product.getOwner())
def getOwners(self):
return self.owners
- CreateProduct, RegisterProductμ λκ°μ§ Methodλ₯Ό ꡬννκ³ μμ΅λλ€.
Client
factory = IDCardFactory()
card1 = factory.create("νκΈΈλ")
card2 = factory.create("μ΄μμ ")
card3 = factory.create("κ°κ°μ°¬")
card1.use()
card2.use()
card3.use()
Output
νκΈΈλμ μΉ΄λλ₯Ό λ§λλλ€.
μ΄μμ μ μΉ΄λλ₯Ό λ§λλλ€.
κ°κ°μ°¬μ μΉ΄λλ₯Ό λ§λλλ€.
νκΈΈλμ μΉ΄λλ₯Ό μ¬μ©ν©λλ€.
μ΄μμ μ μΉ΄λλ₯Ό μ¬μ©ν©λλ€.
κ°κ°μ°¬μ μΉ΄λλ₯Ό μ¬μ©ν©λλ€.
Summary of Factory Method Pattern
- Factory Method Patternμ Factory Patternμ νμ₯λ²μ μ λλ€.
- Factory μ체μ μ¬λ¬ κΈ°λ₯μ μΆκ°νκ³ μΆμ λ μ¬μ©ν©λλ€.
π‘ μλ₯Ό λ€μ΄, Aμ νκ³Ό Bμ νμ λͺκ°λ₯Ό λ§λ€μλμ§ μΆμ νκ³ μΆμ μλ μκ³ , Factoryμ μνλ₯Ό μκ³ μΆμμλ μκ³ , Factoryμμ μμ±λλ μ€λΈμ νΈλ₯Ό μΆκ°μ μΌλ‘ μ²λ¦¬ν΄μΌν μΌμ΄ μμ μ μμ΅λλ€.
μ΄λ΄ λ λ¨μν κΈ°μ€ Factory Patternλ§μΌλ‘λ μΆκ° κΈ°λ₯μ ꡬννλλ° μ΄λ €μμ΄ μμ΅λλ€. → κ·Έλμ Factory Method Patternμ΄ λ±μ₯ν©λλ€.
- Factory Interfaceλ₯Ό λ°λ‘ λμ΄ κ° μ νμ νΉνλ Factoryλ€μ λ§λ€μ΄μ νΉνλ Factoryμ μ¬λ¬ κΈ°λ₯λ€μ μΆκ°ν μ μλλ‘ ν©λλ€.
- Frameworkμ λ΄μ©μ μμ νμ§ μμλ μ ν λ€λ₯Έ μ νκ³Ό 곡μ₯μ λ§λ€ μ μμ΅λλ€.
- μ¦, framework λ΄μ©μ μμ ν νμκ° μμ΅λλ€.
- μ°λ¦¬μ μμμμ framework ν¨ν€μ§λ idcard ν¨ν€μ§μ “μμ‘΄νκ³ μμ§ μλ€”κ³ ννν©λλ€.
ν¨ν΄ μ΄μ©κ³Ό κ°λ°μ κ°μ μμ¬μν΅
- μ€μ λ‘ μ΄λ£¨μ΄μ§λ μ‘°μμ λΉνμ¬ λ³΅μ‘ν νλ‘κ·Έλ¨μΌλ‘ λκ»΄μ§μλ μμ΅λλ€. 1κ°μ ν΄λμ€λ₯Ό μ½λκ²λ§μΌλ‘λ λμμ μ΄ν΄νκΈ° μ΄λ ΅κΈ° λλ¬Έμ λλ€.
- μμ ν΄λμ€μμ λμμ 골격μ μ΄ν΄νκ³ , κ±°κΈ°μμ μ¬μ©λκ³ μλ μΆμ Methodκ° λ¬΄μμΈμ§ νμΈ ν, κ·Έ μΆμ Methodλ₯Ό μ€μ λ‘ κ΅¬ννκ³ μλ ν΄λμ€μ μμ€μ½λλ₯Ό μ΄ν΄λ³Ό νμκ° μμ΅λλ€.
- μΌλ°μ μΌλ‘ λμμΈ ν¨ν΄μ μ¬μ©ν΄μ μ΄λ€ ν΄λμ€λ₯Ό μ€κ³ν λ, κ·Έ ν΄λμ€λ₯Ό 보μ νλ μ¬λμκ² μ€κ³μκ° μλν λμμΈ ν¨ν΄μ΄ 무μμΈμ§λ₯Ό μ λ¬ν νμκ° μμ΅λλ€.
- κ·Έλ μ§ μμΌλ©΄? μ€κ³μμ μ²μ μλμ λλ¨μ΄μ§ μμ μ΄ κ°ν΄μ§ κ°λ₯μ±μ΄ μκΈ° λλ¬Έμ λλ€.
- νλ‘κ·Έλ¨μ μ£Όμμ΄λ κ°λ° λ¬Έμ μμ μ€μ λ‘ μ¬μ©λκ³ μλ λμμΈν¨ν΄μ λͺ μΉ & μλλ₯Ό κΈ°μ ν΄ λλκ²λ μ’μ λ°©λ²μ λλ€.
λ°μν
'πΊοΈ Design Pattern' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Design Pattern] Prototype Pattern - νλ‘ν νμ ν¨ν΄ (0) | 2024.05.21 |
---|---|
[Design Pattern] Abstract Factory Pattern - μΆμ ν©ν 리 ν¨ν΄ (0) | 2024.04.08 |
[Design Pattern] Factory Pattern - ν©ν 리 ν¨ν΄ (0) | 2024.04.08 |
[Design Pattern] Object-Oriented Programming (OOP) (0) | 2024.03.28 |
[Design Pattern] Unified Modeling Language (UML) (0) | 2024.03.28 |