반응형

스니펫: 특수한 목적을 위한 코드

디자인: 문제에 대한 해결책

스탠다드: 문제를 해결하는 대표적인 방식 포괄적임

패턴: 유효성이 검증된 효율적이고 확장 가능한 해결책

참가자: 디자인 패턴에서 사용되는 클래스

비기능적 조건: 메모리 최적화와 사용성, 성능등이 여기에 속함. 솔루션 전체에 영향을 미치는 핵심적인 요소

 

생성패턴

- 객체가 생성되는 방식을 중시

- 객체 생성관련 상세 로직을 숨긴다

- 코드는 생성하려는 개체형과 독립적

 

구조 패턴

- 클래스와 객체를 더 큰 결과물로 합칠 수 있는 구조로 설계

- 구조를 간결화하고 클래스와 객체간의 상호관계 파악

- 클래스 상속과 컴포지션을 중시

 

행위패턴

- 객체간의상호작용과 책임을 중시

- 객체는 상호작용하지만 느슨하게 결합돼야한다.

 

- 파이선 디자인 패턴 출처.

반응형
반응형

정의

the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. 

-- 영어 위키백과

Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다.

-- 한국어 위키백과

 

이런식으로 정의만 보면 절대 이해가 안간다.

바로 예시로 들어가보자.

 

일단 피자가게 사장님이 되었다고 해보자.

1.햄머슈룸 피자

2. 디럭스피자

3. 해산물 피자를 메뉴로 준비하였다.

 

class HamAndMushroomPizza():
    def __init__(self):
        self.__price = 8.50
        
    def put_toping(self):
    	self.topping = "HAM"

class DeluxePizza():
    def __init__(self):
        self.__price = 10.50
        
    def add_toping(self):
    	self.topping = "meat"

class SeafoodPizza():
    def __init__(self):
        self.__price = 11.50
    
    def add_toping(self):
    	self.topping = "meat"
        
    def add_cheese_crust(self):
    	self.cheese_crust = True

 

만약 이렇게 될시에, 소비자가 주문하려고 할때, 각각의 객체생성 방법에 대해 알고 있어야한다.

ham_mushroom_pizza = HamAndMushroomPizza()
delux_pizza = DeluxePizza()
seafood_pizza = SeafoodPizza()

 

이때, pizzaFactory를 하나 만들어준다면 어떻게 될까?

class PizzaFactory: 
    "The Factory Class"

    @staticmethod
    def create_pizza(pizza_type: str):
        if pizza_type == 'HAM_MUSHROOM_PIZZA_TYPE':
            return HamAndMushroomPizza()
        if pizza_type == 'DELUXE_PIZZA_TYPE':
            return DeluxePizza()
        if pizza_type == 'SEAFOOD_PIZZA_TYPE':
            return SeafoodPizza()
        return None


pizza = PizzaFactory().create_pizza("HAM_MUSHROOM_PIZZA_TYPE")

pizza.put_toping()

소비자는 피자 팩토리만 알면, 복잡한 객체생성방법에 대해 알 필요가 없게된다.

지금 예시는 간단해서 필요성을 못느낄수도 있지만,

각 피자에 따라 직접 토핑을 집어넣어줘야 피자가 생성됐다면?

팩토리라는 클라스의 필요성을 느낄수 있을 것이다.

 

 

이렇게만 바뀌면 객체지향적이라고 할 수 있을까?

SOLID원칙중 open/close원칙에 비추어 확인해보도록 하자.

 

 

class PizzaFactory: 
    "The Factory Class"

    @staticmethod
    def create_pizza(pizza_type: str):
        if pizza_type == 'HAM_MUSHROOM_PIZZA_TYPE':
            return HamAndMushroomPizza()
        if pizza_type == 'DELUXE_PIZZA_TYPE':
            return DeluxePizza()
        if pizza_type == 'SEAFOOD_PIZZA_TYPE':
            return SeafoodPizza()
        return None


pizza = PizzaFactory().create_pizza("SEAFOOD_PIZZA")

pizza.put_toping()

앞선 코드에서 피자종류만, 해산물피자로 바꾸었다.

그런데 에러가 날 것이다.

왜냐하면, SEAFOOD피자에서는 put_toping이 아니라 add_toping이기 때문이다.

 

이는 즉, 만약 HAM_MUSHROOM_PIZZA를 먼저만들고, SEAFOOD 피자로 확장했다고 했을떄,

확장을 했을때 코드를 수정해야한느 일이 발생한 것이다.

즉, 확장에 열려있고, 수정에 닫혀있어야한다는 open/closed principle에 어긋난다.

 

그러면 어떻게 해줘야할까?

class Pizza(ABCMeta):
    def __init__(self):
        self.__price = None
	
    @abstractmethod
    def add_toping(self):
    	pass


class HamAndMushroomPizza(Pizza):
    def __init__(self):
        self.__price = 8.50

    def add_toping(self):
	self.topping = "HAM"


class DeluxePizza(Pizza):
    def __init__(self):
        self.__price = 10.50

    def add_toping(self):
	self.topping = "MEAT"
        
        
class SeafoodPizza(Pizza):
    def __init__(self):
        self.__price = 11.50
        
       
    def add_toping(self):
	self.topping = "SEAFOOD"        
        
        
    def add_cheese_crust(self):
    	self.cheese_crust = True

 이런식으로 추상화된 클라스를 만들어줘서 통일감있게 강제해줘야한다.

이렇게 추상화된 클라스를 상속받기만 하면, 기존코드 수정 없이, 새로운 피자를 만들어낼 수 있다.(확장)

 

이는 또한 생성이라는 역할을 factory가 다 맡고 있다는 점에서 단일책임 원칙을 지키고 있다고 볼 수 있다.

반응형
반응형

1. 발단

어떻게 하면 객체지향 프로그래밍 지식을 한 시간안에 잘 전달할 수 있을까? 이러한 고민에서 이 시리즈가 시작되었다.

필자는 매주 일요일 cs지식공유스터디를 하는데, 각자 공부한 것을 30~1시간정도 나누는 시간이다.

그래서 필자가 최근 열심히 공부한 객체지향을 나누고 싶은데, 이게 객체지향 특성상 말로 떠든다고 절대 와닿지 않는다.

특히 solid원칙은 직접해보고 생각해보고, 리팩토링을 해봐야 느낄수 있는 영역이라고 생각된다.

 

2. 전개

그러던중 필자는 디자인패턴을 공부하고 있었는데 너무 노잼이었다. 이 역시 객체지향을 처음 공부할떄랑 비슷한 느낌이 드는건데, 그거 좋은거 알겠는데, 머 어쩌라고? 이런느낌이 드는건 어쩔 수 없다.

이때 머릿속을 스쳐지나간 생각이 아. 디자인패턴을 역으로 solid 원칙 및  4기둥에 비추어 분석하고, 이를 같이 나눠보면 나도 공부되고 스터디원도 공부되지 않을까? 생각이 들었다.

 

 

반응형

'computer 지식 > 디자인패턴으로 알아보는 객체지향' 카테고리의 다른 글

디자인 패턴 용어들  (0) 2022.01.08
#1 팩토리패턴  (0) 2021.11.28

+ Recent posts