기타/디자인패턴
-
-
싱글톤 패턴 *기타/디자인패턴 2021. 9. 14. 23:05
객체가 하나만 필요한 경우 스레드 풀, 캐시 대화상자, 사용자 설정, 레지스트리 설정 처리 객체, 로그 기록용 객체, 프린터나 그래픽카드 같은 디바이스를 위한 디바이스 드라이버 같은 객체 연결풀, 스레드풀 관리 전역변수의 단점 전역변수에 객체를 대입하면 애플리케이션이 시작될 때 객체가 생성되는데 (*플랫폼에 따라 다름) 근데 객체가 자원을 많이 차지한다면, 애플리케이션이 끝날 때까지 객체사용을 하지 않을 때 불필요하게 자원을 낭비하게 된다. 싱글톤 패턴은 필요할 때만 객체를 생성할 수 있다. * 어떻게 하면 한 클래스의 인스턴스가 두 개 이상 만들어지지 않도록 할 수 있을까? > new Obj(); new 생성자를 사용하지 못하게 한다. => 생성자를 private 으로 선언, 객체를 메서드를 통해 반환..
-
행위패턴 > 템플릿 메서드 *기타/디자인패턴 2021. 2. 12. 15:42
템플릿은 틀을 의미한다. 템플릿 메서드는 알고리즘의 틀을 만들기 위한 것이다. 템플릿 메서드 패턴에서는 알고리즘의 골격을 정의한다. 템플릿 메서드는 일련의 단계들로 알고리즘을 정의한 메서드를 의미한다. 여러 단계 중 일부는 서브 클래스에서 구현할 수 있다. 템플릿 메서드를 이용하면 알고리즘 구조는 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있다. 커피와 차를 만드는 과정이 각각 아래와 같다. 커피 => 1.물을 끓인다. 2. 커피를 우린다. 3. 커피를 컵에 4. 설탕과 우유 추가 차 => 1.물을 끓인다. 2. 차를 우린다. 3. 차를 컵에 4. 레몬 추가 이 때 일반화를 통해 공통으로 사용 가능한 부분을 추상화한 클래스를 만든다. "1. 끓인다.", "3. 컵에"와 같은 완전히 동일한 행동이 ..
-
행위패턴 > 상태(State) *기타/디자인패턴 2021. 2. 12. 15:41
동일한 동작을 객체 상태에 따라 다르게 처리해야 할 때 사용. 일련의 규칙에 따라 객체의 상태(State)를 변화시켜, 객체가 할 수 있는 행위를 바꾸는 패턴이다. 이렇게 하나의 객체에 여러 가지 상태(예, 정지, 상승, 하강)가 존재할 때 패턴을 사용하지 않고 프로그래밍을 하면 if 문 또는 switch 문을 사용하여 처리한다. 그런데 신규 상태(예, 문 열림, 문 닫힘)가 발생하면 프로그램을 다시 수정해야 한다. 또는 상속을 통해 만든 클래스에 새로운 기능을 추가할 때 일부 하위 클래스에서는 신규 기능이 필요하지만, 일부 클래스와는 무관할 때는? 뽑기 기계를 예시로, 동전없음, 동전있음, 알맹이 매진, 알맹이 판매 라는 네개의 상태를 가지는 뽑기 기계가 있다고 하자. public class Gambl..
-
행위패턴 > 옵저버 *기타/디자인패턴 2021. 2. 12. 15:39
객체의 상태변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성 데이터 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용 Subject 와 Observer 는 서로를 변수로 가지고 있는다. Observer 는 생성자에서 받은 subject 를 registerObserver(this)로 등록해두고, Subject 에서는 자신에게 변화가 있을 때 Observer notify 를 호출한다. push방식, poll 방식으로 구현할 수 있다. Product 에 상태에 변화가 생기면 Observer 에서 이를 감지하고 ProductDisplay 에게 알려준다. public class ObTest { public static void main(Str..
-
행위패턴 > 이터레이터 *기타/디자인패턴 2021. 2. 11. 15:19
객체를 컬렉션에 저장할 때는 배열, 스택, 해시테이블 등 장단점을 따져 적합한 컬렉션을 선택해 이용한다. 클라이언트에서 모든 객체들에 일일이 접근하는 작업을 하고자할 때, 어떤 식으로 저장했는지 노출하지 않으면서 접근할 수 있도록 하는 방법과 객체들로 구성된 슈퍼 컬렉션에 대해 알아본다. A 식당과 B 식당이 합병하기로 했는데 A 식당은 메뉴를 ArrayList 에 B식당은 배열에 저장한다. Waitress 는 메뉴를 출력하려면 배열과 리스트 각각의 순환문을 작성해야 한다. Waitress 가 구상클래스 MenuItem[] 과 ArrayList 에 직접 연결되어있다. public class Waitress { PancakeHouseMenu pancake; DinerMenu diner; public Wai..
-
행위패턴 > 커맨드 *기타/디자인패턴 2021. 2. 11. 10:14
Invoker 와 Command 의 생명주기 같음 ConcreateCommand 는 Command 의 일반화 Client 는 ConcreteCommand 를 의존 객체의 행위( 메서드)를 클래스로 만들어 캡슐화 하는 패턴 어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하기 위해 객체(B)를 의존하는 것을 방지 또한 기능이 수정되거나 변경이 일어날 때 A 클래스 코드를 수정없이 기능에 대한 클래스를 정의하면 되므로 시스템이 확장성이 있으면서 유연해진다. Client 클래스 RemoteLoader 는 concreteCommand 를 생성하고 Receiver 를 생성한다. Receiver Light, Garage 는 요구 사항을 수행하기 위해 어떤 일을 해야 하는지 알고 있는 객체이다. ConcreteCo..
-
구조패턴 > 퍼싸드 *기타/디자인패턴 2021. 2. 11. 10:12
facade : 1(건물의) 정면[앞면] 2(실제와는 다른) 표면, 허울 퍼사드 패턴은 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공하는 것을 말한다. 퍼사드에서 고수준 인터페이스를 제공하기 때문에 서브시스템을 더 쉽게 사용할 수 있다. 예를 들어 홈씨어터에 조명, 스크린, 프로젝트,dvd 기계들을 끄고 켜고 등 조작하는 행위들을 하는 여러 서브시스템을 가지고 있을 때, 그러한 여러 객체를 한 번에 호출하고 조작해주는 facade 객체를 생성하는 것이다. * 최소 지식 원칙 객체 사이의 상호작용은 될 수 있으면 아주 가까운 "친구" 사이에서만 허용하는 것이 좋다. 어떤 객체든 그 객체와 상호작용하는 클래스의 개수, 상호작용을 어떤식으로 하는 지에 주의를 기울여야 한다는 의미이다. 여..