design pattern #1 Creational pattern - Factory Method

  • Factory 라고 해서, 뭔가 찍어내는 듯한 느낌 이었는데, 그것과는 좀 거리가 멀다.
  • 이론적으로 읽어선 한번에 이해가 안가고, 예제를 통해서 보는게 역시 쉽다.
  • 아래처럼 File  이 Product  라고 하고, Directory 를 Creator 라고 하고, Application 을 client  라고 하면. 
  • 요점은 product 의 공통 분모를 interface 로 설계 한다는것
  • Creator 의 공통 분모는 abstract class 로 설계 한다는것
  • 그리고 Creator 에 여기서 말하는 Factory Method 인 createFile 이 abstract  로 들어가 있는게 중점 같다.
  • 그러면 creator 와 product  가 tight 하게 coupling 되지 않고
  • Single Responsibility Principle  을 지킬 수 있으며(factory method 는 createFile 하나뿐이다)
  • 기존 프로그램을 건드리지 않고 new product type 을 추가 할 수 있다.
  • 그리고 각각 공통된 기능은 interface 나 abstract  로 뺄 수 있다.
  • 대신 물론, 더 복잡해진다.

*Product
 public interface File {
    void size();
void onClick();
}
public class MusicFile implements File {

public void size() {
//implement
}

public void onClick() {
//implement
}
}

public class PhotoFile implements File {

public void size() {
//implement
}

public void onClick() {
//implement
}
}

*Creator
public abstract class Directory {

public void createAndBackup() {
File file = createFile();
file.backup();
}

/**
* Subclasses will override this method in order to create specific
* objects.
*/
public abstract File createFile();
}

public class MusicDirectory extends Directory {

@Override
public File createFile() {
return new MusicFile();
}
}

public class PhotoDirectory extends Directory {

@Override
public File createFile() {
return new PhotoFile();
}
}

*Client
public class Application {
    private static Directory directory;

public static void main(String[] args) {
configure();
runBusinessLogic();
}

static void configure() {
if (isMusicDirectory()) {
directory = new MusicDirectory();
} else {
directory = new PhotoDirectory();
}
}

static void runBusinessLogic() {
directory.createAndBackup();
}
}

Comments

Popular posts from this blog

삼성전자 무선사업부 퇴사 후기

개발자 커리어로 해외 취업, 독일 이직 프로세스

코드리뷰에 대하여