package kr.ac.green;
import java.util.Hashtable;
import java.util.Properties;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import kr.ac.green.cmds.ICmd;
import kr.ac.green.cmds.ListCmd;
public class CmdFactory {
private static Hashtable<String, ICmd> cmds = new Hashtable<String, ICmd>();
public static void init(Properties prop) {
try {
Set<?> keys = prop.keySet();
for(Object keyObj : keys) {
String key = keyObj.toString();
String className = prop.getProperty(key);
// reflection 리플렉션
// 시스템처럼 안에서 동작하는 라이브러리에서 사용, 코드에서는 잘 사용안함
// 객체 new 안하고도 만들 수 있는 방법, 풀 패키지명만 있으면 만들 수 있음
// 이렇게하면 클래스 객체를 뽑아낼 수 있다
// 기본 생성자로 만들어짐, 생성자를 선택할 수도 있음
// Object라 형변환을 해야함
// private한것도 다 쓸수 있고 불러낼 수 있음
// Class klass = Class.forName(className);
// 이 객체는 타입별로 하나만 있고
// newListCmd 객체를 만든다고 할때 멤버변수만 힙에 올라가고
// 클래스안에 있는 객체만 참고함
// Class klass2 = ListCmd.class;
ICmd cmdObj = (ICmd)Class.forName(className).newInstance();
cmds.put(key, cmdObj);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void doAction(HttpServletRequest request, String cmd) {
if(!cmds.containsKey(cmd)){
cmd = "/null.book";
}
cmds.get(cmd).action(request);
}
}
Void라는 클래스도 존재
자바는 전부다 객체지향적으로 되어있음
우리가 만들었던 메인서블릿, 커멘드 클래스의 의존성을 낮추려고 만든거임
찾기편하게 하기위해서도 만듬
if(cmd.equals(xxx)){
cmdObj = new xxxCdm();
}
따로따로 작업하지 않기 위해서 연관성을 끊고 일관성을 만들려고
interface를 만듬
ListCmd, UpdateCmd 가 바뀌면 MainServlet에도 바뀜
그래서 ICmd를 만듬 (결합도를 낮추려고)
브릿지 역할로 만들어준 클래스가 CmdFactory
