Factory Method
OOP 프로그램에서 Object의 생성/소멸을 어떻게 관리할지에 대해서 일반화 해놓은 패턴 중 하나이다.
특히, 객체생성을 직접하는 것이 아니라, 타 클래스에 위임을 통해 약한연결( Loose Coupling ) 을 구현 코드의 의존성을 줄인다.
Sample 코드의 변환과정.
가정조건.
1) 10개의 Business Logic이 담겨있는 클래스가 있다고 가정하자.
2) 이 10개의 Class에서는 모두 Oracle DB와 DB Connection 문구가 들어있다.
3) 이 Oracle DB가 너무 비싸서 현재 위탁을 할지 MySQL로 전환될지 확실치 못하다.
4) 만약 MySQL로 전환된거나, 다른 DB로 전환 될 때 어떻게 해야 할까?
가) 절차적방식의 코딩. [HardCoding]
String server = "192.168.0.1";
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@test.server:1521:ORCL","scott","tiger");
~~~~~~
=> 10개의 Class를 열어서 모두 관련 내용을 수정해 준다.
=> 아 10개 정도 할만하다. 그럼 1000개는 어떠한가?
나) 절차적 프로그램의 코딩. [좀더 유연한 코딩/공유 상수를 통한방식]
static String final gStrServer = "192.168.0.1";
static String final gStrConn = "jdbc:oracle:thin:@test.server:1521:ORCL","scott","tiger";
Connection con = DriverManager.getConnection(gStrConn);
=> 공유 상수를 통해 항시 같은 방법으로 열릴 수 있다.
=> 1000개여도 1번만 수정하면 된다.
=> 어 그런데 con을 획득한 후 뭔가 설정값을 바꾸워 줄 일이 생겼다. 아 1000번을 수정하자.
Object 생성을 위탁하자. 마치 주문자 생상 방식처럼 공장에 위탁해 보자.
다) 객체지향 코딩/결합도 높음
ClsDataObject dbCon= new ClsDataObject();
Connection con = dbCon.getConnection();
=> Class를 [ClsDataObject]를 만들고 이 클래스의 [getConnection] Method을 통해 Object생성을 위임하였다.
=> 위임은 했으나 결합도가 높다. ( Class가 수정시 본문의 프로그램이 영향을 바로 받는다. )
라) 객체지향 코딩/결합도 보통
IFDBObject dbCon = new ClsDataObject();
=> Interface를 [IFDBObject]를 ClsDataObject에서 [Implementation]하고, 이를 dbCon이 Casting한 형태이다.
=> 위임은 했으나 결합도가 상대적으로 낮다. ( Interface만을 대상으로 사용자 측이 사용하므로 위험성이 덜하다, 그러나 Object생성용 Class/ interface의 영향권 에 있다. )
마) 객체지향 코딩/결합도 낮음
ClsDataObjectFactory {
IFDBObject dbCon = new ClsDataObject();
}
ClsDataObjectFactory = new ClsDataObjectFactory ();
=> 앞선 라)의 생성내용을 Class [ClsDataObjectFactory ] 내부로 끌어들였다.
=> 이제 본문과 DataBase Connection관련 Methd는 아무런 관련이 없다.
마) 객체지향 코딩/결합도 매우낮음
ClsDataObjectFactory {
IFDBObject dbCon = new ClsDataObject();
}
IFDBObjectFactory dbCon = new ClsDataObjectFactory ();
=> Factory Class자체도 Interface를 통해 사용함으로써, 결합도를 매우 낮추워 버린다.
앞선, 코딩은 예제는 정말 말도 문법이 엉망인 코딩이다.
왜? 쓰기 귀찮으니까.
여기서 중요한 것은, 논리적으로 무엇을 말하고자 하는가가 중요하기 때문이다.
'프로그래밍 > JAVA' 카테고리의 다른 글
JAVA에서 NULL 체크 어떻게 하고 계시나요? (1) | 2018.01.16 |
---|---|
디자인 패턴 MVC (0) | 2018.01.03 |
List,Set,Map 어떤것을 사용해야 할까? (0) | 2018.01.03 |
추상메서드와 인터페이스 공통점, 차이점 (0) | 2017.12.22 |
개발자가 놓치기 쉬운 자바의 개념, 기본원리 (0) | 2017.12.13 |