📌디자인 패턴이란?
- 코딩을 하면서 나타나는 문제들을 ~한 패턴으로 코딩하면 해결하더라
- 이러한 문제해결 패턴들을 모아둔 것
📌creational patterns
- 객체 생성시 어떻게 클래스의 구성할 것 인가?(불필요한 의존성 등)에대한 패턴
📖factory method pattern
- 객체와 해당 객체의 클래스 사이의 의존성을 낮추는 패턴
- 객체를 생성하는데 구체적인 클래스의 이름을 사용하지 않으면서 확장 및 수정을 용이하게
why? : new className(arg1)
으로 객체를 만들면 객체와 클래스간의 강한 의존성이 생김 className를 수정하여 파라미터가 1개 더 늘어났다고 가정하면 해당 클래스의 객체를 사용하던 사람의 코드도 바뀌어야함
AnOperation()
메소드에서는 FactoryMethod()
라는 본인 클래스내의 추상 메소드(비어져있는 메소드)를 사용하여ConcreteProduct
의 객체를 만든다, 이때 FactoryMethod()
는 자식 클래스에서 오버라이딩 되었으므로 동적 바인딩으로 ConcreteCreator
의 오버라이딩된 FactoryMethod()
가 호출 됨
AnOperation()
을 사용하는 유저는 어떤 클래스의 객체를 만드는지 구체적으로 모름
📖abstract factory pattern
- 논리적으로 연관있는 객체를 한번에 만드는데 이러한 연관된 객체들을 만들어내는 팩토리(클래스)를 그룹핑하겠다
- 최상위 클래스인 House공장은 추상 메소드를 2개 갖고 있음
- ELBF공장은 LightBulb와 EIBBBlind 객체를 만드는 팩토리(그룹 또는 클래스)
- Luxmater공장은 LuxmaterBulb와 LuxmaterBlind를 만드는 팩토리(그룹 또는 클래스)
📖singleton pattern
- 프로그램 실행중에 클래스의 인스턴스가 1개만 유지 되도록 하는 패턴
- 1개의 인스턴스만 실행이 있어도 가능한 경우에 메모리를 최소화 하기 위해 사용
📌structual patterns
- 큰 구조의 프로젝트에서 클래스를 어떻게 구성하고 구조화할 것 인가?에대한 패턴
📖adapter pattern
- 인터페이스 호환성 문제로 같이 쓸 수 없는 클래스들을 연결하여 쓸 수 있도록 하는 패턴
클라이언트는 Request()
인터페이스로된 클래스만 사용가능, SpecificRequest()
라는 인터페이스를 가진 다른 클래스 사용 불가능
Adapter
라는 클래스를 만들어 Request()
인터페이스를 그대로 사용하면서도 SpecificRequest()
인터페이스도 사용할 수 있게 만듬
📖composite pattern
- 다른 클래스간의 공통된 인터페이스들을 모아서 마치 1가지의 클래스인 것 처럼 사용하도록 하는 패턴
Computer
라는 composite은 각각의 부품에 getPrice를 사용하여 부품 총합 getPrice를 인터페이스를 구현한다
📌behavioral patterns
- 각 객체가 맡은 역할들을 어떻게 배치할 것 인가?에대한 패턴
📖iterator pattern
- 객체 내부의 요소들을 하나씩 꺼내어 어떤 동작을 하려 할 때, 사용자는 내부가 어떤 구조로 되어있든 같은 인터페이스를 이용하여 해당 동작을 수행하도록 하는 패턴
- 내부구조가 바뀌어도 사용자가 사용할 코드(인터페이스에대한)는 바뀌지 않도록 하는 것
📖observer pattern
- 어떤 Subject 클래스에 Observer 객체들을 추가, Subject 객체에 어떤 이벤트가 일어나면 Observer에게 알려주고 Observer는 받은 알림에 따라 어떤 동작을 하는 패턴
📖state pattern
- state에따라 객체의 행동이 달라지도록 설계하는 패턴
- state가 추가되어도 기존의 코드를 최대한 유지한채로 수정할 수 있다.