본문 바로가기

프로그래밍/JAVA

디자인 패턴 : FACTORY METHOD

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를 통해 사용함으로써, 결합도를 매우 낮추워 버린다.



앞선, 코딩은 예제는 정말 말도 문법이 엉망인 코딩이다.

왜? 쓰기 귀찮으니까.

여기서 중요한 것은, 논리적으로 무엇을 말하고자 하는가가 중요하기 때문이다.