ν©ν 리 λ©μλ ν¨ν΄ μ΄ν΄νκΈ°
1. ν¨ν΄ κ°μβ
ν©ν 리 λ©μλ ν¨ν΄(Factory Method Pattern)μ κ°μ²΄ μμ± μ½λμ μ€λ³΅κ³Ό μμ‘΄μ±μ μ€μ΄κ³ , μ½λμ νμ₯μ±μ λμ΄κΈ° μν΄ μ¬μ©λλ λμμΈ ν¨ν΄μ λλ€. μ΄λ λμΌν μΈν°νμ΄μ€λ₯Ό λ°λ₯΄λ μ¬λ¬ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν λ, ν΄λΌμ΄μΈνΈ μ½λκ° ν΄λΉ ν΄λμ€λ€μ ꡬ체μ μΈ κ΅¬ν λ΄μ©μ μ νμ μμ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλλ‘ λμ΅λλ€.
2. λ¬Έμ μν© μμβ
κΈ°λ³Έμ μΈ μ½λ ꡬ쑰β
class Truck:
def deliver(self):
return "νΈλμ νκ³ μ΄λ°νλ€"
class Ship:
def deliver(self):
return "λ°°λ₯Ό νκ³ μ΄λ°νλ€"
# μ΄μ‘ μλ¨μ λ°ννλ ν¨μ
def get_transport(transport_type):
if transport_type == TransportType.TRUCK:
return Truck()
elif transport_type == TransportType.SHIP:
return Ship()
# μ¬μ© μμ
transport1 = get_transport(TransportType.TRUCK)
print(transport1.deliver()) # "νΈλμ νκ³ μ΄λ°νλ€"
transport2 = get_transport(TransportType.SHIP)
print(transport2.deliver()) # "λ°°λ₯Ό νκ³ μ΄λ°νλ€"
TransportType Enum μΆκ°β
νλΌλ―Έν° μ λ ₯μ μμ νκ² νκΈ° μν΄ λ¬Έμμ΄ λμ Enumμ μ¬μ©ν©λλ€.
from enum import Enum
class TransportType(Enum):
TRUCK = "truck"
SHIP = "ship"
AIRPLANE = "airplane"
μλ‘μ΄ μꡬμ¬ν μΆκ°β
λ§μ½ μλ‘μ΄ μ΄μ‘ μλ¨μΈ λΉνκΈ°λ₯Ό μΆκ°νλ€κ³ κ°μ ν΄ λ΄ μλ€.
class Airplane:
def deliver(self):
return "λΉνκΈ°λ₯Ό νκ³ μ΄λ°νλ€"
get_transport ν¨μμ λΉνκΈ° νμ
μ μΆκ°ν©λλ€.
# ν©ν 리 λ©μλμ μ νμ
μΆκ°
if transport_type == TransportType.AIRPLANE:
return Airplane()
3. ν©ν 리 λ©μλ ν¨ν΄ λμ β
ν©ν 리 λ©μλ ν¨ν΄μ μ¬μ©νλ©΄ κ°μ²΄ μμ± λ‘μ§μ λ³λμ ν΄λμ€ λλ λ©μλλ‘ λΆλ¦¬νμ¬ νμ₯μ±μ λμΌ μ μμ΅λλ€.
κΈ°λ³Έ ꡬ쑰β
TransportμΈν°νμ΄μ€(μΆμ ν΄λμ€): λͺ¨λ μ΄μ‘ μλ¨ ν΄λμ€κ° 곡ν΅μ μΌλ‘ ꡬνν΄μΌ ν λ©μλλ₯Ό μ μν©λλ€.- ꡬ체μ μΈ μ΄μ‘ ν΄λμ€(Truck, Ship, Airplane λ±):
Transportλ₯Ό μμλ°μdeliver()λ©μλλ₯Ό ꡬνν©λλ€. - ν©ν 리 ν΄λμ€: κ°μ²΄ μμ± μ± μμ λ΄λΉνμ¬, νΉμ μ΄μ‘ μλ¨μ λ°νν©λλ€.
μ½λ ꡬν μμβ
# μΆμ ν΄λμ€ (κΈ°λ³Έ ꡬ쑰 μ μ)
class Transport:
def deliver(self):
raise NotImplementedError("deliver λ©μλλ₯Ό ꡬνν΄μΌ ν©λλ€.")
# κ° μ΄μ‘ μλ¨ ν΄λμ€
class Truck(Transport):
def deliver(self):
return "νΈλμ νκ³ μ΄λ°νλ€"
class Ship(Transport):
def deliver(self):
return "λ°°λ₯Ό νκ³ μ΄λ°νλ€"
class Airplane(Transport):
def deliver(self):
return "λΉνκΈ°λ₯Ό νκ³ μ΄λ°νλ€"
# ν©ν 리 ν΄λμ€
class TransportFactory:
def create_transport(self, transport_type: TransportType):
if transport_type == TransportType.TRUCK:
return Truck()
elif transport_type == TransportType.SHIP:
return Ship()
elif transport_type == TransportType.AIRPLANE:
return Airplane()
else:
raise ValueError(f"μ μ μλ μ΄μ‘ μλ¨: {transport_type}")
# μ¬μ© μμ
factory = TransportFactory()
transport1 = factory.create_transport(TransportType.TRUCK)
print(transport1.deliver()) # "νΈλμ νκ³ μ΄λ°νλ€"
transport2 = factory.create_transport(TransportType.AIRPLANE)
print(transport2.deliver()) # "λΉνκΈ°λ₯Ό νκ³ μ΄λ°νλ€"
4. ν©ν 리 λ©μλ ν¨ν΄μ μ₯μ β
- μ μ°μ± μ¦κ°: μλ‘μ΄ μ΄μ‘ μλ¨μ μΆκ°ν λ
TransportTypeμλ§ μλ‘μ΄ νμ μ μ μνλ©΄ λ©λλ€. - μ½λ μ€λ³΅ κ°μ: κ°μ²΄ μμ± μ½λκ° ν κ³³μ λͺ¨μ¬ μμ΄ μ€λ³΅μ μ€μ΄κ³ μ μ§λ³΄μκ° μ©μ΄ν©λλ€.
- νμ₯μ± ν₯μ: ν΄λΌμ΄μΈνΈ μ½λκ° κ΅¬μ²΄μ μΈ ν΄λμ€μ μμ‘΄νμ§ μκ³ , μΈν°νμ΄μ€λ μΆμ ν΄λμ€λ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μ¬μ©ν μ μμ΅λλ€.
- SOLID μμΉ μ€μ: κ°λ°©-νμ μμΉ(OCP)κ³Ό λ¨μΌ μ± μ μμΉ(SRP)μ λ§μ‘±ν©λλ€.
5. κ°μ λ μ½λ μμ (λ§€ν ν μ΄λΈ νμ©)β
쑰건문 λμ λ§€ν ν μ΄λΈμ νμ©νμ¬ κ°μ²΄ μμ±μ λμ± κ°λ¨νκ² λ§λ€ μλ μμ΅λλ€.
# ν©ν 리 ν΄λμ€ κ°μ
class TransportFactory:
transport_classes = {
TransportType.TRUCK: Truck,
TransportType.SHIP: Ship,
TransportType.AIRPLANE: Airplane
}
def create_transport(self, transport_type: TransportType):
transport_class = self.transport_classes.get(transport_type)
if transport_class is None:
raise ValueError(f"μ μ μλ μ΄μ‘ μλ¨: {transport_type}")
return transport_class()
# μ¬μ© μμ
factory = TransportFactory()
transport = factory.create_transport(TransportType.TRUCK)
print(transport.deliver()) # "νΈλμ νκ³ μ΄λ°νλ€"
6. ν©ν 리 λ©μλ ν¨ν΄μ μ€μ μ¬μ© μβ
- λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ ν: λ€μν λ°μ΄ν°λ² μ΄μ€ λλΌμ΄λ²λ₯Ό μ ννμ¬ μ μ ν 컀λ₯μ μ μμ±ν μ μκ² ν΄μ€λλ€.
from enum import Enum, auto
class DBType(Enum):
MYSQL = "mysql"
POSTGRES = "postgres"
class DBConnection:
def connect(self):
pass
class MySQLConnection(DBConnection):
def connect(self):
return "MySQL μ°κ²° μμ±"
class PostgresConnection(DBConnection):
def connect(self):
return "Postgres μ°κ²° μμ±"
class DBConnectionFactory:
connection_classes = {
DBType.MYSQL: MySQLConnection,
DBType.POSTGRES: PostgresConnection
}
def create_connection(self, db_type: DBType):
connection_class = self.connection_classes.get(db_type)
if connection_class is None:
raise ValueError(f"μ μ μλ λ°μ΄ν°λ² μ΄μ€ μ ν: {db_type}")
return connection_class()
# μ¬μ© μμ
factory = DBConnectionFactory()
connection = factory.create_connection(DBType.MYSQL)
print(connection.connect()) # "MySQL μ°κ²° μμ±"
7. κ²°λ‘ β
ν©ν 리 λ©μλ ν¨ν΄μ μ½λμ μ μ§λ³΄μμ±κ³Ό νμ₯μ±μ λμ΄κ³ , κ°μ²΄ μμ±μ λν μ± μμ λΆλ¦¬ν¨μΌλ‘μ¨ λ³΅μ‘ν μμ€ν μ λμ± ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλλ‘ λμ΅λλ€. νΉν λ€μν ν΄λμ€κ° κ³΅ν΅ κΈ°λ₯μ μ 곡ν΄μΌ νλ κ²½μ°μ μ μ©νκ² μ¬μ©λ μ μμΌλ©°, μ½λμ μ¬μ¬μ©μ±κ³Ό κ°λ μ±μ λμμ λμΌ μ μμ΅λλ€.