반응형

* 디자인패턴이란?

- 객체지향 하면서 여러 문제가 발생하는데, 이때 처음부터 해결하는 것이 아닌 이전에 사용했던 해결책을 다시 사용

- 객체지향 설계시 좋은 아키텍처나 설계를 재사용할 수 있도록 만든 패턴이다.

 

 GOF 디자인 패턴에서는 크게 세가지로 구분한다. 생성, 구조, 행위 패턴

 

1> 생성 패턴 

- 시스템이 어떤 클래스를 사용하는지에 대한 정보를 캡슐화한다. 

- 특정 객체가 변경되거나 추가되어도 프로그램 구조에 크게 영향을 미치지 않는다.

- 싱글톤, 빌더패턴, 추상팩토리, 팩토리메서드, 프로토타입 등이 있다.

 

2> 구조패턴

- 객체나 클래스를 조합해 더 큰 구조를 만드는 패턴

- 서로 다른 인터페이스를 지닌 2개를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴

- 퍼사드, 프록시, 브릿지, 컴퍼지트, 데커레이터

 

3> 행위패턴

- 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴

- 한 객체가 혼자 수행할 수 없는 작업을 여러개의 객체로 나눠서 분리, 그렇게하면서 결합도를 최소화

 

반응형

'개발공부 > 디자인패턴' 카테고리의 다른 글

디자인패턴1. 팩토리 메서드 패턴  (0) 2018.08.30
반응형
이 내용은 디자인패턴 스터디를 준비하며 정리한 내용이다. 첫 시간에 팩토리패턴을 맡게 되어 정리해보았다.

먼저, 디자인 패턴에는 포함되지 않지만 팩토리 구조에 대해 먼저 이해해보는 시간을 가져보자.

팩토리를 사용하는 이유

클라이언트에서 사용할 객체를 생성하는 부분을 캡슐화하여 느슨한 결합 상태로 만들어, 변화에는 닫혀있고 확장에는 열려있는 코드를 만들 수 있다.

 Duck duck;

 if ( type == picnic ) duck = new MallardDuck();

 else if ( type == hunting ) duck = new DecoyDuck();

 else if ( type == inBathTub) duck = new RubberDuck();


뭔가 변경하거나 확장해야 할 때 코드를 다시 확인하고 추가 또는 제거해야 한다는 것을 의미함.
구상클래스를 많이 사용하면 새로운 요구사항이 생길때마다 코드를 고쳐야 하기때문에 많은 문제가 생긴다. 

- 이 문제를 해결하기 위해 자주 바뀌는 코드를 바뀌지 않는 코드와 분리 시켜야한다.

 Pizza orderPizza(String type) {

       Pizza pizza;

         

     if(type.equals("cheese")) pizza = new CheesePizza();

       else if(type.equals("greek")) pizza = new GreekPizza();

       else if(type.equals("pepperoni")) pizza = new PepperoniPizza();       

  

       pizza.prepare();

       pizza.bake();

       pizza.cut();

       pizza.box();

       return pizza;

 } 


굵게 표시된 부분을 캡슐화 해보자. 아래 예제 처럼 일반적으로 팩토리라 하면은 객체 생성을 처리하는클래스로 사용된다. 

 public class SimplePizzaFactory {

    public Pizza createPizza(String type){ //이런 경우에는 static메소드로 선언하는 경우가 종종 있음.

         Pizza pizza = null;

         if(pizza.equals("cheese")) pizza = new CheesePizza();

         if(pizza.equals("pepper")) pizza = new PepperoniPizza();

         if(pizza.equals("clam")) pizza = new ClamPizza();

         if(pizza.equals("veggie")) pizza = new VeggiePizza();

         return pizza;

    }

 }


생성을 한군데 에서 관리할 수 있다는 이점이 있다. 이것은 팩토리 패턴이라기 보다 팩토리라 불리는 관용구에 가깝다.
팩토리의 정의는 객체 생성 처리 클래스이다. 하지만 이러한 팩토리만 이용한다고 해서 팩토리 패턴이라 부를 수 없다.

팩토리 메소드 패턴(Factory Method Pattern)

객체를 만들어내는 부분을 서브클래스에 위임하는 패턴이다. 이를 위해서는 다음과 같은 조건이 필요하다.

첫째, 객체 생성을 위한 인터페이스를 정의하여야 하고, 

생산자 클래스는 서브클래스로 인해 성질이 정의되어야한다.

또한, 팩토리에서 객체를 생성하여 제품 클래스에서 실제로 재작한다.


메인 프로그램에서 new 키워드가 없다. 객체 생성을 팩토리 클래스에 위임하였기 때문이다.

팩토리 패턴을 사용하는 이유는 클래스간 결합도를 낮추기 위해서 즉,  변경점이 생겼을때 다른 클래스의 영향을 최소화 하기 위해서이다.팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거한다.


* 다이어그램



product 인터페이스 : 생성할 대상의 클래스를 추상화시킨 인터페이스. 생성 대상이 되는 구상 클래스는 이 인터페이스를 구현해야 한다.
Creator: product를 생성하기 위한 기능이 정의되어있는 추상클래스(또는 인터페이스), product를 만드는 메소드는 구현이 없는 추상메소드로 정의해여야한다. 팩토리의 역할을 가진 모든 클래스는 이 인터페이스를 구현해야 한다.

이러한 구조를 갖기 때문에 Product를 생성하는 factoryMethod()는 Creator의 구상클래스에서 구현한다.
Product를 만드는 방법은 Creator의 구상클래스가 구현하므로 생성 대상의 구상 클래스를 만들어내는 작업은 해당 클래스에서 책임지며 추후 변경사항이 생겨도 이 클래스만 변경한다.






출처: http://jusungpark.tistory.com/14 [정리정리정리]
https://cheolhojung.github.io/2018/03/21/%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%86%8C%EB%93%9C-%ED%8C%A8%ED%84%B4/


반응형

'개발공부 > 디자인패턴' 카테고리의 다른 글

디자인패턴  (0) 2021.01.14

+ Recent posts