초보 자바 디자인 모델 수기 - 공장 모델 (Factory Pattern)


염 홍 의 에서 ,공장 모델 (Factory Pattern) 은 다음 과 같은 몇 가지 형태 로 나 뉜 다.
1. 단순 공장 (Simple Factory) 모델: 정적 공장 방법 모델 (Static Factory Method Pattern) 이 라 고도 부른다.
2. 공장 방법 (Factory Method) 모델: 다 태 성 (Polymorphic Factory) 모델 또는 가상 구조 자 (Virtual Construtor) 모델 이 라 고도 부른다.
3. 추상 공장 (Abstract Factory) 모델: 공구 상자 (Kit 또는 Toolkit) 모델 이 라 고도 부른다.
  
에서 주로 공장 방법 (Factory Method) 모델 과 추상 적 인 공장 (Abstract Factory) 모델 이다.
 
 
 
먼저 공장 모델 의 몇 가지 형 태 를 고려 하지 않 고 공장 모델 의 명칭 을 보면 공장 모델 은 이해 하기 쉬 운 것 같 고 현실 에 반 영 된 예, 예 를 들 어:
이치 폭스바겐 (공장 역할) 은 많은 자동차 (추상 적 인 제품 류 역할) 를 생산 했 는데 그 중에서 아우디 A6 (구체 적 인 제품 역할) 라 고 한다.
 
이것 은 썩 은 예 로 쓰 인 다.그러면 이 예 를 좀 더 형상화 하 자. 한 고객 이 이 아우디 A6 자동 차 를 사려 고 한다.
자바 구현 은 다음 과 같 습 니 다. 예 1 (공장 모드 사용):
 
자동차 (추상 적 인 제품 류 역할):
/*
 *            ,     (     )
 */
public abstract class Car {
	
	public String name;
	
}

 
아우디 A6 (구체 적 인 제품 캐릭터):
/*
 *   A6,             (     )
 */
public class AudiA6Car extends Car {
	
	public AudiA6Car(){
		this.name = "  A6";
		
	}
	
	public String toString(){
		return "  "+ this.name;
	}

}

 
이치 대중 (공장 역할):
정적 인 공장 방법 manufactureCar () 를 정의 하여 Car 유형의 쌍 상 을 되 돌려 줍 니 다.
 
/*
 *        ,     (   )
 */
public class CarFactory {

	/*
	 *     (                  )
	 */
	public static Car manufactureCar(){
		
		return new AudiA6Car();
	}

}
 
 
이 아우디 A6 자동 차 를 산 고객 A (클 라 이언 트): 
/*
 *        A(   )
 */
public class CustomerA {
	
	public static void main(String[] args){
		
//		               
		Car myCar = CarFactory.manufactureCar();
		System.out.println("       ,     。");
		
//		         ,     
		System.out.println("     "+myCar+"。     !");
	}

}

  
이 예 를 보 았 을 때 (이런 유사 한 예 가 많다) 첫 번 째 느낌 은 공장 모델 이 간단 하고 이해 하기 쉽 잖 아 요.
 
 
그러나 이때 두 가지 문제 가 있다. 공장 모델 을 사용 하지 않 으 면 예전 에는 어떻게 이 루어 졌 을 까?이전의 실현 방식 에는 어떤 문제 가 있 습 니까?
예 2 (공장 모드 사용 하지 않 음):
 
자동차 (추상 적 인 제품 류 역할): 코드 는 예 1 과 같다.
아우디 A6 (구체 적 인 제품 역할): 코드 는 예 1 과 같다.
이 아우디 A6 자동 차 를 산 고객 B (클 라 이언 트):
/*
 *        B(   )
 */
public class CustomerB {
	
	public static void main(String[] args){
		
//		         
		Car myCar = new AudiA6Car();
		System.out.println("       。");
		
//		         ,     
		System.out.println("     "+myCar+"。     !");
	}

}

 
사용 모드 와 사용 하지 않 는 모드 의 차 이 를 비교 해 보 세 요.
1. 예 1 (디자인 모델 사용) 은 예 2 (디자인 모델 사용 하지 않 음) 보다 공장 류 가 1 개 더 많다.
2. 클 라 이언 트 (고객 A 와 고객 B) 에서 예 1 (공장 모델) 은 new 방법 을 사용 하지 않 고 공장 방법 manufactureCar () 를 사용 했다.예 2 (공장 모드 없 음) new 방법 을 사용 했다.new 를 사용 하지 않 는 것 이 new 를 사용 하 는 것 보다 낫 기 때 문 입 니까?자세히 연구 한 결과 공장 모델 도 new 를 사 용 했 고 이 를 공장 류 의 공장 방법 인 manufactureCar 에 두 었 을 뿐 클 라 이언 트 가 아니 라 공장 류 의 공장 방법 인 manufactureCar 에 두 었 다.
 
이렇게 보면 디자인 모델 을 사용 하 는 것 도 장점 이 없 잖 아 요. 클 라 이언 트 코드 줄 수가 같 고 한 가지 종류 가 더 많아 졌어 요.
 
그래, 다시 생각해 보 자. 자동차 한 대 를 사 는 것 이 그렇게 간단 합 니까?자동차의 구성 은 매우 복잡 하 다.그것 은 바퀴, 핸들, 의자, 엔진, 색깔 등 이 있어 야 한다.
이 예 를 좀 더 풍부하게 해라.
이번 에는 디자인 모델 을 사용 하지 않 는 예 를 살 펴 보 자.예 3 (디자인 모드 를 사용 하지 않 음):
자동차 (추상 적 인 제품 류 역할): 
/*
 *            ,     (     )
 */
public abstract class Car {
	
	public String name;
	
}

 
 아우디 A6 (구체 적 인 제품 캐릭터):
자동차 에 많은 속성 을 추가 하면 대상 의 생 성 과정 이 복잡 해진 다.
/*
 *   A6,             (     )
 */
public class AudiA6Car extends Car {
	
	private String wheels;
	private String steering_wheel;
	private String car_seats;
	private String car_color;
	private String engine;
	
	public AudiA6Car(){
		this.name = "  A6";
		
	}
	
//       
	public void setCar_color(String car_color) {
		this.car_color = car_color;
	}

//       
	public void setCar_seats(String car_seats) {
		this.car_seats = car_seats;
	}

//        
	public void setEngine(String engine) {
		this.engine = engine;
	}

//        
	public void setSteering_wheel(String steering_wheel) {
		this.steering_wheel = steering_wheel;
	}

//       
	public void setWheels(String wheels) {
		this.wheels = wheels;
	}

//	            。。。。。。

//	       
	public String toString(){
		return "  "+ this.name+"[" + this.car_color + "," + this.car_seats+"," + this.engine
		+ "," + this.steering_wheel + "," + this.wheels +"]";
	}

}

 
이 아우디 A6 자동 차 를 산 고객 B (클 라 이언 트):
/*
 *        B(   )
 */
public class CustomerB {
	
	public static void main(String[] args){
		
//		          B,     B    。
		AudiA6Car myCar = new AudiA6Car();
		
//		    
		myCar.setCar_color("  ");
		
//		    
		myCar.setCar_seats("  ");
		
//		     
		myCar.setEngine("   ");
		
//		     
		myCar.setSteering_wheel("   ");
		
//		    
		myCar.setWheels("    ");
		
//		       。。。。。。
		
		System.out.println("       "+myCar);
		
//		           
		System.out.println("    ,             ??!!         ?          !!!");
	}

}

 
실행 결과:
           A6[  ,  ,   ,   ,    ]
    ,             ??!!         ?          !!!

 
 
 고객 이 매우 불쾌 해 하 는데, 자동차의 조립 이 너무 복잡 한데, 어떻게 자동 차 를 한 대 사서 또 스스로 조립 해 야 합 니까?이 자동 차 는 운전 할 수 있 습 니까?성능 과 안전 이 보장 되 나 요?
 
공장 에서 자동 차 를 조립 하 는 모습 이 어떤 지 보 자. 예 4 (공장 모드 사용):
자동차 (추상 적 인 제품 류 역할):  코드 는 예 3 과 같다.
아우디 A6 (구체 적 인 제품 역할): 코드 는 예 3 과 같다.
 
이치 대중 (공장 역할):
복잡 한 조립 과정 은 그래도 공장 에서 하 자.
/*
 *        ,     (   )
 */
public class CarFactory {

	/*
	 *     (                  )
	 */
	public static Car manufactureCar(){
		
		AudiA6Car oneCar = new AudiA6Car();

//		    
		oneCar.setCar_color("  ");
		
//		    
		oneCar.setCar_seats("  ");
		
//		     
		oneCar.setEngine("   ");
		
//		     
		oneCar.setSteering_wheel("   ");
		
//		    
		oneCar.setWheels("    ");
		
//		       。。。。。。
		
		System.out.println("         ");
		
//		       		
		return oneCar;
	}

}

 
  이 아우디 A6 자동 차 를 산 고객 A (클 라 이언 트):
/*
 *        A(   )
 */
public class CustomerA {
	
	public static void main(String[] args){
		
//		               
		Car myCar = CarFactory.manufactureCar();
		
//		         ,     
		System.out.println("     "+myCar+"。     !    。。。");
	}

}

 실행 결과:
         
         A6[  ,  ,   ,   ,    ]。     !    。。。

 
손님 A 는 쉽게 아우디 A6 한 대 를 사서 기 쁘 게 차 를 몰 고 드라이브 를 갔다.
 
 
비교 예 3 과 예 4 를 통 해 공장 모델 의 장점 을 나 타 냈 다.
공장 모델 을 이용 하여 대상 의 창설 과정 과 사용 을 분리 할 수 있 고 복잡 한 대상 의 창설 과정 을 공장 류 로 봉인 할 수 있다.
1. 이렇게 되면 클 라 이언 트 가 사용 하기 가 매우 쉽다.
예 를 들 어 고객 이 빨간색 아우디 A6 를 원한 다 면 간단 합 니 다. 공장 에서 빨간색 을 보 내 면 됩 니 다.고객 은 단지 즐겁게 그것 을 운전 하기 만 하면 된다.
 
2. 그리고 이 시스템 은 직책 이 뚜렷 하고 사고방식 이 뚜렷 하 다.
예 를 들 어 교통사고 가 나 면 브레이크 문제 로 인 한 것 이 라면 업 체 를 찾 아야 한다.고객 의 음 주운 전 으로 인 한 것 이 라면 고객 을 찾 아야 한다.
정확 한 조사 대상 을 확정 하고 문제 의 진정한 원인 을 찾 아야 적당 한 해결 방법 을 찾 을 수 있 으 며 오심 과 억울 한 사건 은 없 을 것 이다.
 
3. 그 밖 에 이렇게 하면 중용 할 수 있 는 역할 도 한다.
예 를 들 면: 아무리 많은 고객 이 사 더 라 도 같은 것 만 사면 생산 라인 한 세트 만 사용 하면 되 고 많은 시간 과 자원 을 절약 할 수 있다.
 
4. 앞으로 의 유지 와 수정 시 사용 대상 의 영향 이 줄어든다.
 
예 를 들 어 고객 은 아우디 A6 가 어떻게 조립 되 었 는 지 알 필요 가 없다.원래 사람 이 손 으로 담 았 을 수도 있 었 다.나중에 기계 로 장 착 했 어 요.그 후에 더욱 선진 적 인 설비 로 설치 했다.고객 이 차 를 사 는 것 은 운전 을 위해 서 이 며, 차 를 어떻게 조립 하 는 지 알 필요 가 없 기 때문이다.
 
예 를 들 어 여러 명의 고객 이 같은 자동 차 를 구 매 했다. 만약 에 이 자동차의 브레이크 에 문제 가 있다 면 하나의 공장 류 만 수정 하면 된다. 고객 이 사용 하 는 과정 에서 어떤 변화 도 느끼 지 않 고 자신의 사용 방식 을 바 꿀 필요 가 없다.
 
남 겨 진 문제:
우리 가 JDBC 를 사용 하여 데이터 베 이 스 를 조작 할 때 공장 모델 을 사용 하지 않 았 습 니까?Oracle 을 연결 하 든 MySQL 을 연결 하 든 우 리 는 쓰기 가 매우 간단 하지 않 습 니까?모든 데이터베이스 의 연결 디 테 일 에 관심 을 가 질 필요 가 없 지 않 습 니까?MySQL 에서 Oracle 까지 의 이식 이 쉽게 이 루어 지지 않 았 습 니까?공장 모드 만 쓴 거 아니 야?  
 
공장 모델 의 응용 이 많은 것 같 고 다른 디자인 모델 과 함께 사용 되 는데 실제 프로젝트 와 구조 에서 공장 모델 을 어떻게 사용 합 니까?
 
 자, 작은 정 리 를 하 겠 습 니 다.
하나의 시스템 의 좋 고 나 쁨 은 종류 가 적 을 수록 좋 은 것 이 아니 라 디자인 모델 을 사용 하여 연근 과 포장 을 이해 함으로써 디자인 을 더욱 합 리 적 으로 하고 시스템 의 직책 이 뚜렷 하고 뚜렷 하 며 유지 와 확장 도 더욱 쉽다.
그러나 디자인 모델 을 사용 했다 고 해서 합 리 적 인 것 은 아니다.예 1 과 예 2 처럼 디자인 모델 은 어떤 장점 도 가 져 오지 않 고 오히려 시스템 을 번 거 롭 게 한다.

좋은 웹페이지 즐겨찾기