[장 육 아 큰소리 디자인 모델] - 간단 한 공장 모델, 공장 방법 모델, 추상 적 인 공장 모델

공장 모델 은 디자인 모델 에서 매우 중요 한 창설 형 모델 로 공장 모델 은 간단 한 공장 모델, 추상 적 인 공장 모델 과 공장 방법 모델 로 나 뉜 다.다음은 이 몇 가지 공장 모델 을 토론 한다.
1. 간단 한 공장 모델
    장 육 아 는 요 리 를 잘 하 는 사람 으로 그의 여자 친구 인 서 씨 는 족발 을 매우 좋아한다.족발 은 여러 가지 방법 이 있 습 니 다. 예 를 들 어 족발 조림, 족발 구 이, 족발............................................................................(요구 가 정말 높다) 이렇게 되면 앞으로 서쪽 이 족발 을 먹고 싶 을 때마다 "여보, 뜸 들 여 주세요 / 간 / 족발 구 이 ~" 라 고 말 하면 된다.장 육 아 는 족발 을 어떻게 만들어 야 하 는 지 금방 알 게 되 었 다. 샤 오 서 는 매번 자신의 요 구 를 한 번 씩 말 할 필요 가 없다. 샤 오 서 는 자신 이 어떤 족발 을 먹고 싶 은 지 에 만 관심 을 가 져 야 한다. 족발 의 구체 적 인 제작 과정 에 관심 을 가 져 서 는 안 된다 ~
    위의 과정 은 간단 한 공장 모델 입 니 다. 장 육 아 는 공장 입 니 다. 서로 다른 족발 은 공장 제품 입 니 다. 소비자 소 서 는 공장 에 어떤 제품 이 필요 한 지 요청 한 다음 에 제품 을 받 아들 이면 됩 니 다. 그러나 이런 모델 은 몇 가지 단점 이 있 습 니 다.
    1. 샤 오 시가 새로운 족발 을 먹고 싶 을 때 는 이미 만들어 진 족발 을 사서 장 육 아 에 게 이 족발 의 방법 을 배 워 서 자신의 머 릿 속 에 기억 하 게 해 야 한다. (확장 성 이 떨 어 지 므 로 먼저 새로운 제품 류 를 만 들 고 공장 류 에서 해당 하 는 방법 을 고 쳐 야 한다. 개폐 원칙 에 어 긋 난다)
    2. 샤 오 시가 먹고 싶 은 세 가지 족발 에 자신 만 의 독특한 추가 양념 이 있다 면 (예 를 들 어 족발 뜸 을 들 일 때 콩, 족발 을 넣 는 동시에 계란 을 넣 어야 한다) 장 육 아 는 거절 할 것 이다 (너무 번거롭다). (제품 마다 추가 적 인 파라미터 가 필요 할 때 단순 공장 모델 은 지원 되 지 않 는 다)
//     
public abstract class ZhuTi {
	public abstract void cook();
}
//      
public class KaoZhuTi extends ZhuTi{
	@Override
	public void cook() {
		System.out.println("          ~");
	}
}
public class LuZhuTi extends ZhuTi{
	@Override
	public void cook() {
		System.out.println("          ~");
	}
}
public class MenZhuTi extends ZhuTi{
	@Override
	public void cook() {
		System.out.println("          ~");
	}
}
//    ,   
public class Zhang6er {
	public static final int TYPE_M = 1;
	public static final int TYPE_K = 2;
	public static final int TYPE_L = 3;
	
	public static ZhuTi createZhuTi(int type) {
		switch(type) {
		    case 1:
			    return new MenZhuTi();
		    case 2:
		    	    return new KaoZhuTi();
		    case 3:
		    	default:
		    		return new LuZhuTi();	
		}
	}
}
public class Run {
	public static void main(String args[]) {
		ZhuTi zhuti = Zhang6er.createZhuTi(Zhang6er.TYPE_K);
		zhuti.cook();
	}
}

2. 공장 방법 모델
    위의 간단 한 공정 모델 의 단점 에서 우 리 는 개폐 원칙 (확장 개방, 수정 폐쇄) 을 위반 하고 공장 방법 모델 은 이 문 제 를 잘 해결 할 수 있다 고 언급 했다.
    장 육 아 는 좋 은 요리사 이지 만 평생 이 세 가지 족발 만 만 들 수 는 없다. 그러나 새로운 방법 이나 다른 요 리 를 만 날 때마다 장 육 아 는 반드시 만 드 는 것 을 배 워 서 머 릿 속 에 기억 해 야 한다. (공장 류 의 수정, 개폐 원칙 위반)이것 은 매우 어 려 운 일 입 니 다. 그래서 장 육 아 는 방법 을 생각해 보 았 습 니 다. 작은 공책 을 많이 샀 습 니 다. 새로운 방법 이나 새로운 요 리 를 배 울 때마다 이 요리 의 방법 을 한 공책 에 기록 하 였 습 니 다. 즉, 서양 에서 요 리 를 주문 할 때마다 장 육 아 는 해당 하 는 공책 을 찾 은 후에 공책 에 있 는 방법 에 따라 요 리 를 하면 된다 는 것 입 니 다. 이때 장 육 아 는육 아 는 추상 적 인 공장 에 해당 하고 레 시 피 를 기록 하 는 공책 은 모든 구체 적 인 제품 을 생산 하 는 공장 사례 에 해당 한다. 그러면 개폐 원칙 을 위반 하지 않 고 공장 모델 을 실현 할 수 있다.
ps: 제품 류 는 전례 와 같 습 니 다.
//       ,           
public abstract class Zhang6er {
	public abstract ZhuTi createZhuTi();
}
//          
public class Zhang6erK extends Zhang6er{
	@Override
	public ZhuTi createZhuTi() {
		return new KaoZhuTi();
	}

}
public class Zhang6erM extends Zhang6er{
	@Override
	public ZhuTi createZhuTi() {
		return new MenZhuTi();
	}

}
//                   ,        
public class Run {
	public static void main(String args[]) {
		ZhuTi zhuti = new Zhang6erM().createZhuTi();
		zhuti.cook();
	}
}

단점:
    1. 신제품 을 추가 할 때 신제품 류 를 추가 하 는 동시에 이에 대응 하 는 구체 적 인 공장 류 를 제공 해 야 한다. 시스템 류 의 개 수 는 쌍 을 이 루어 증가 하고 어느 정도 에 시스템 의 복잡 도 를 증가 할 것 이다. 또한 더 많은 유형 은 컴 파일 과 운영 이 필요 하고 시스템 에 추가 적 인 비용 을 가 져 다 줄 것 이다.
     2. 공장 방법 내의 수정 과 폐쇄 를 보장 하지만 공장 방법 을 사용 하 는 유형 에 대해 다른 제품 을 교체 하려 면 구체 적 인 공장 류 를 수정 해 야 한다.
     3. 하나의 구체 적 인 공장 은 하나의 구체 적 인 제품 만 만 들 수 있다.
3. 추상 적 인 공장 모델
    공장 방법 모델 은 간단 한 공장 모델 에 존재 하 는 문제점 을 해 결 했 지만 신제품 을 추가 할 때 는 추상 적 인 공장 류 에서 계승 하 는 새로운 종 류 를 늘 려 야 한다. 기 존의 코드 를 수정 하지 않 아 도 된다. 그러나 우 리 는 구체 적 인 공장 이 단일 제품 (족발 만 만 만 드 는 것) 만 생산 할 수 있 는 것 이 아니 라 다른 것 (디저트 와 음료) 도 생산 할 수 있 기 를 바란다.추상 적 인 공장 모델 이라는 개념 을 도입 해 야 한다.
    추상 적 인 공장 모델 을 설명 하기 전에 먼저 제품 등급 구조 와 제품 족의 개념 을 말 해 보 자.
    1. 제품 등급 구조: 제품 등급 구 조 는 바로 제품 의 계승 구조 이다. 예 를 들 어 핸드폰 - > 샤 오미 핸드폰, 삼 성 핸드폰, 오포 핸드폰 등 이다.
    2. 제품 족: 제품 족 은 같은 공장 에서 생산 되 고 서로 다른 제품 등급 구조 에 있 는 제품 을 말한다. 애플 회사 - > 아이 폰 (핸드폰), iwatch (시계), macbook (컴퓨터).
    장 육 아 는 간단 한 요리사 가 되 는 것 에 만족 하지 않 았 다. 그 는 자신 에 대한 요구 가 높 았 고 세계 각국 의 다양한 요 리 를 배 울 뜻 을 세 웠 다. 그래서 그 는 중국 음식 레 시 피, 프랑스 음식 레 시 피, 일식 레 시 피 등 을 샀 다. 모든 레 시 피 에는 메 인 요리, 음료, 디저트 등 이 있 었 다. 앞으로 장 육 아 는 새로운 요 리 를 배우 고 싶 으 면 태국 레 시 피 등 새로운 레 시 피 를 계속 살 수 있다.(공장 인터페이스 구현) 또는 중국 음식 / 프랑스 음식 /... 메뉴 뒤에 메뉴 에 없 는 요 리 를 추가 하 는 방법 (요리 인터페이스 구현)머 릿 속 에 모든 요 리 를 기억 하지 않 아 도 된다. 이렇게 해서 샤 오 시가 프랑스 음식 을 먹고 싶 을 때 장 육 은 프랑스 음식 레 시 피 를 꺼 내 샤 오 시 에 게 와인 그라탱, 블 루베 리 에 어로 졸, 슈 프 레 를 포함 한 세트 를 만들어 줄 수 있다.
    우 리 는 추상 적 인 공장 을 하나의 제품 을 계속 세분 화 할 수 있다 고 상상 할 수 있다. 그것 은 각 씨앗 제품 을 조립 해 야 한다. 그리고 모든 서브 제품 은 해당 하 는 추상 적 인 제품 (예 를 들 어 메 인 요리, 디저트) 에 대응 하고 이런 서브 제품 들 은 공동으로 하나의 제품 (세트) 을 구성한다. 그러면 우 리 는 공장 인 터 페 이 스 를 실현 할 때 하나의 제품 족 (예 를 들 어 프랑스 음식, 중국 음식) 을 만 들 었 다.우 리 는 한 공장 을 통 해 같은 제품 족 에 속 하 는 여러 제품 을 생산 할 수 있다 (공장 방법 모델 을 사용 하면 더 많은 종 류 를 만들어 야 한다).
//      
public interface TianPin {
	void cookTP();
}
public interface YinPin {
	void cookYP();
}
public interface ZhuCai {
	void cookZC();
}
//   
public class Beef implements ZhuCai{
	@Override
	public void cookZC() {
		System.out.println("  ");
	}
}
public class FriedRice implements ZhuCai{
	@Override
	public void cookZC() {
		System.out.println("  ");
	}
}
public class Juice implements YinPin{
	@Override
	public void cookYP() {
		System.out.println("  ");
	}
}
public class Coffee implements YinPin{
	@Override
	public void cookYP() {
		System.out.println("  ");
	}
}
public class PumpkinPie implements TianPin{
	@Override
	public void cookTP() {
		System.out.println("   ");
	}
}
public class Souffle implements TianPin{
	@Override
	public void cookTP() {
		System.out.println("   ");
	}
}
//    
public abstract class AbstractFactory {
	public abstract ZhuCai cookZhuCai();
	public abstract TianPin cookTianPin();
	public abstract YinPin cookYinPin();
}
public class ChineseMeal extends AbstractFactory{
	@Override
	public TianPin cookTianPin() {
		return new PumpkinPie();
	}
	@Override
	public ZhuCai cookZhuCai() {
		return new FriedRice();
	}
	@Override
	public YinPin cookYinPin() {
		return new Juice();
	}	
}
public class FranchMeal extends AbstractFactory{
	@Override
	public ZhuCai cookZhuCai() {
		return new Beef();
	}
	@Override
	public TianPin cookTianPin() {
		return new Souffle();
	}
	@Override
	public YinPin cookYinPin() {
		return new Coffee();
	}
}
public class Main {
	public static void main(String args[]) {
		AbstractFactory chineseMeal = new ChineseMeal();
		TianPin tianPin = chineseMeal.cookTianPin();
		YinPin yinPin = chineseMeal.cookYinPin();
		ZhuCai zhuCai = chineseMeal.cookZhuCai();
		zhuCai.cookZC();
		yinPin.cookYP();
		tianPin.cookTP();
	}
}

    장점: 한 제품 족 중의 여러 대상 이 함께 일 하도록 설계 되 었 을 때 클 라 이언 트 는 항상 같은 제품 족 중의 대상 만 사용 하고 제품 등급 구조 가 확장 되 기 쉽다 (새로운 레 시 피 한 권 사기).
    단점: 제품 족 확장 이 매우 어렵 습 니 다. 일련의 특정한 제품 을 추가 하려 면 추상 적 인 Creator 에 코드 를 추가 해 야 할 뿐만 아니 라 구체 적 인 유형 에 코드 를 추가 해 야 합 니 다.

좋은 웹페이지 즐겨찾기