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
}
}*Creatorpublic 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
Post a Comment