초보 자바 디자인 모델 수기 - 공장 모델 (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 처럼 디자인 모델 은 어떤 장점 도 가 져 오지 않 고 오히려 시스템 을 번 거 롭 게 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.