디자인 패턴 10

복합체 패턴

여러 객체들을 하나로 관리하기 위한 패턴. 예를 들자면 전화번호부 목록. 전체 조회를 해보려면 하나로 관리하는게 편하다. 거기에는 분류에 따라서 대학교 친구, 고등학교 친구가 있을 텐데, 그건 Friend 클래스나 인터페이스를 상속받아 하면 된다. 그 다음 복합체 클래스의 멤버 컬렉션(리스트 등)에 추가 해 준뒤, 그거를 for로 읽어주면 된다. 다음 코드는 도형 전체를 관리하는 코드이다. public interface Shape { public void draw(String fillColor); } public class Circle implements Shape { @Override public void draw(String fillcolor) { System.out.println("Drawing C..

적응자 패턴

객체지향은 이미 구현되어 있는 클래스를 이용하여 다른 기능을 만들기 위해 상속이라는 기능이 있지만, 이는 객체지향에서 금기시 되어지고 있다. 이유는 다형성을 위배하고, 불필요한 인터페이스를 전파하며, 클래스 계층관계를 이해하는데 혼돈을 준다. 그 단점을 파훼하기 위한 패턴이 적응자 패턴이다. 적응자 패턴은 어떤 기능을 가진 클래스가 필요한 기능이 있는 클래스의 객체를 가지고 있는 패턴이다. class Stack{ private Vector vector = new Vector(); public void push(T t){ vector.add(t); } public T pop(){ if(vector.size() == 0) return null; T t = vector.get(vector.size() - 1)..

싱글톤

싱글톤은 자주 쓴다고 한다. 싱글톤이 뭐냐면 객체 하나만 있는 클래스이다. 즉 클래스를 만들면 class OneObject{ static OneObject oneObject = null; private OneObject(){} public static OneObject CreateOneObject(){ if( oneObject == null){ oneObject == new OneObject(); } return oneObject; } } 이 클래스의 생성에는 오직 CreateOneObject 하나만 관여를 한다. 장점은 전화번호부 관리클래스 등, 리스트를 관리하는 Manager나 Handler 클래스 등 딱 하나만 필요한 객체에 접근하기 좋다.

원형(prototype) 패턴

원형 패턴은 일종의 식당 메뉴와 같다. 미리 정해진 틀 대로 음식을 만들어 놓고, 손님이 주문하면 그 음식을 주는거다. 프로토타입 객체가 어떠한 객체들에 대한 원형을 가지고 있다가, 요청시 그 객체를 복사하여 주는 것이다. class MazePrototypeFactory extends MazeFactory { public Maze MakeMaze(); public Maze MakeRoom(int roomNum); public Maze MakeWall(); public Maze MakeDoor(Room room1, Room room2); private Maze prototypeMaze; private Maze prototypeRoom; private Maze prototypeWall; private Maz..

팩토리 메서드

팩토리 메서드란... 생성부분을 따로 빼놓는 거다. 추상클래스에 createGameObject() 라는 함수를 정의 하고, 이걸 다른 것들이 상속 받으면.. 장점은 객체 생성 후에 해야 할 공통적인 수행을 정의할 수 있고 GameObject를 인자로 받아 다형성이 가능해진다. (이건 그냥 추상 패턴의 장점) 그리고, 생성자는 private GameObject(){} 이런 식으로 해서 오직 create함수만 생성에 담당하게 하면 좋다. 템플릿을 사용한 서브클래싱은 피해야 한다.

빌더 패턴

빌더 패턴은 생성에 관련된 패턴이다. 우리가 클래스를 만들다 보면 상당히 많은 멤버변수들이 있다. 이름, 나이, 전화번호 등등 이러다보면 이 클래스를 생성(객체)할 때 생성자의 멤버변수의 위치 등 고려해야 할 사항이 많다. 그런데 이걸 내부 클래스나 이런 걸로 빌더로 정의해두면 정말 쉽다. 빌더는 음.. 일종의 임시 클래스라고 생각하면 좋을 것 같다. 어떤 클래스의 빌더는 그 클래스의 똑같은 멤버변수를 가지고 있는거다 (그렇다고 해서 그 클래스를 상속받는게 아니다. 다른 클래스다.) 상수로 사용하고 싶은 것은 생성자를 이용해 받아야 겠지만, 나머지는 기본값을 넣어두고, setter를 이용해 받는 것이다. 단, setter지만 목적과 방법이 조금 다르므로 빌더의 경우는 그냥 멤버변수의 이름으로 한다. Ga..

추상 팩토리

이게 책이 옛날 책인데 (GOF) 요새 객체지향 하면 다 이거 배운다. 그만큼 아주 효과적이여서 아예 abstract라는 명령어를 아예 DVE에서 제공을 해준다. 먼저 아예 추상적인 클래스를 정의해 주는거다. 그 다음 구체적인 내용들을 이 추상클래스를 상속받은 서브클래스들이 그 내용을 정의 해주는 거다. 이렇게 하면 엄청난 다형성이 생긴다. 예를 들면 동물의 추상적인 개념에서 개, 고양이, 말 같은 더 구체적인 객체를 위한 정의를 해준다. 동물이라는 추상 클래스에 bark()라는 추상 메소드를 정의 한 뒤, 각각의 서브 메소드 들이 overriding 하여 이를 구현하는 것이다. 이렇게 하면 인자로 Animal animal로 받아서 animal.bark()하면 알아서 다 각자의 소리를 낸다. 비슷한데 분..

디자인 패턴 개요

디자인 패턴이란 객체지향의 장점을 최대로 활용한 일종의 제시되는 틀이다. 즉, 시간적, 공간적 효율의 위한 알고리즘 보다는 확장성, 독립성, 캡슐화 등을 통한 유지 보수 효율을 끌어오는 기술들이다. 뉴턴을 포함한 위인들은 "내가 더 멀리 보았다면 이는 거인들의 어깨 위에 올라서 있었기 때문이다." 라는 말을 한다. 디자인 패턴이 이런 종류의 것이라고 생각한다.