디자인 모델 의 BuliderPattern 건설 자 모델

7475 단어 디자인 모드
건설 자 모델 정의 와 특징
작성 자 (Builder) 모드 정의:
복잡 한 대상 의 구 조 를 그 표현 과 분리 시 켜 같은 구축 과정 에서 서로 다른 표현 을 만 들 수 있 도록 하 는 것 을 말한다. 이런 디자인 모델 은 건축 자 모델 이 라 고 불 린 다.그것 은 복잡 한 대상 을 여러 개의 간단 한 대상 으로 분해 한 후에 한 걸음 한 걸음 구축 한 것 이다.그것 은 변 하지 않 는 것 과 분 리 될 것 이다. 즉, 제품 의 구성 부분 은 변 하지 않 지만 모든 부분 은 유연 하 게 선택 할 수 있다.
이 모델 의 주요 장점:
1. 각 구체 적 인 건설 자 는 서로 독립 되 고 시스템 의 확장 에 유리 하 다.2. 클 라 이언 트 는 제품 내부 로 구 성 된 세부 사항 을 알 필요 가 없고 세부 적 인 위험 을 통제 하기 쉽다.
마찬가지 로 주요 단점:
1. 제품 의 구성 부분 이 똑 같 아야 하기 때문에 사용 범 위 를 제한 합 니 다.2. 제품 의 내부 변화 가 복잡 하면 이 모델 은 많은 건축 자 류 를 증가 할 것 이다.3. 건축 자 (Builder) 모델 과 공장 모델 의 관심 사 는 다르다. 건축 자 모델 은 부품 의 조립 과정 을 중시 하고 공장 방법 모델 은 부품 의 설립 과정 을 더욱 중시 하지만 이들 은 결합 하여 사용 할 수 있다.
건설 자 모델 의 구조
건설 자 (Builder) 모델 은 제품, 추상 적 인 건설 자, 구체 적 인 건설 자, 지휘자 등 4 가지 요소 로 구성 되 어 있 으 며, 이제 그 기본 구조 와 실현 방법 을 분석 해 보 자.
주요 역할 은 다음 과 같다.
1. 제품 역할 (Product): 여러 구성 부품 을 포함 하 는 복잡 한 대상 으로 구체 적 인 건축 자가 각 부품 을 만 듭 니 다.2. 추상 적 인 건축 자 (Builder): 제품 의 각 하위 부품 을 만 드 는 추상 적 인 방법 을 포함 하 는 인터페이스 로 복잡 한 제품 으로 돌아 가 는 방법 getResult () 도 포함한다.3. 구체 적 인 건축 자 (Concrete Builder): 추상 적 인 건축 자 인 터 페 이 스 를 실현 하고 복잡 한 제품 의 각 부품 의 구체 적 인 생 성 방법 을 완성 합 니 다. 4. 지휘자 (Director): 건축 자 대상 중의 부품 구조 와 조립 방법 을 호출 하여 복잡 한 대상 의 생 성 을 완성 합 니 다. 스윙 자 에서 구체 적 인 제품 의 정 보 를 언급 하지 않 습 니 다.
건설 자 (Builder) 모델 의 구체 적 인 실현
A. 추상 적 인 제품 캐릭터 (Product):
public abstract class CarModel {
	//                
	private ArrayList sequence = new ArrayList<>();
	//         
	protected abstract void start();
	//   ,       ,      
	protected abstract void stop();
	//      ,    ,     
	protected abstract void alarm();
	//        ,      
	protected abstract void engineBoom();
	//        ,      ,      ,     
	final public void run() {
		//    ,   ,     
		for (int i = 0; i < this.sequence.size(); i++) {
	    	String actionName = this.sequence.get(i);
			//   start   ,    ;//   stop   ,    
			if (actionName.equalsIgnoreCase("start")) {
				this.start(); 
			} else if (actionName.equalsIgnoreCase("stop")) {
				this.stop(); 
			//   alarm   ,      ;   engineboom   ,      
			} else if(actionName.equalsIgnoreCase("alarm")){
				this.alarm();
			}else if(actionName.equalsIgnoreCase("engine boom")) {
				this.engineBoom();
			}
		}
	}
	//            
	final public void setSequence(ArrayList sequence) {	this.sequence = sequence;	}
}

B1, 제품 캐릭터 (Product): 벤츠 모델
public class BenzModel extends CarModel {
    @Override
    protected void alarm() {        
    	System.out.println("              ...");    
    }
    @Override
    protected void engineBoom() {        
    	System.out.println("            ...");    
    }
    @Override
    protected void start() {        
    	System.out.println("            ...");    
    }
    @Override
    protected void stop() {        
    	System.out.println("         ...");    
    }
}

B2, 제품 캐릭터 (Product): BMW 모델
public class BMWModel extends CarModel {
    @Override
    protected void alarm() {        
    	System.out.println("              ...");    
    }
    @Override
    protected void engineBoom() {        
    	System.out.println("            ...");    
    }
    @Override
    protected void start() {        
    	System.out.println("            ...");    
    }
    @Override
	protected void stop() {	
		System.out.println("         ...");    
	}
}

C. 추상 적 인 건축 자 (Builder): 제품 의 각 하위 부품 을 만 드 는 추상 적 인 방법 을 포함 하 는 인터페이스 나 추상 적 인 유형 으로 복잡 한 제품 으로 돌아 가 는 방법 getResult (), 예 를 들 어 이곳 의 getCarModel () 도 포함한다.
public abstract class CarBuilder {
    //      ,         ,      
    public abstract void setSequence(ArrayList sequence);
    //       ,             
    public abstract CarModel getCarModel();
}

D1, 구체 적 인 건축 자 (Concrete Builder): 추상 적 인 건축 자 인 터 페 이 스 를 실현 하고 복잡 한 제품 의 각 부품 의 구체 적 인 구축 방법 을 완성 합 니 다.
public class BenzBuilder extends CarBuilder {
    private BenzModel benz = new BenzModel();
    @Override
    public CarModel getCarModel() {        
    	return this.benz;    
    }
    @Override
    public void setSequence(ArrayList sequence) {        
    	this.benz.setSequence(sequence);    
    }
}

D2, 체 건설 자 (Concrete Builder): 추상 적 인 건설 자 인 터 페 이 스 를 실현 하고 복잡 한 제품 의 각 부품 의 구체 적 인 생 성 방법 을 완성 합 니 다.
public class BMWBuilder extends CarBuilder {
    private BMWModel bmw = new BMWModel();
    @Override
    public CarModel getCarModel() {        
    	return this.bmw;    
    }
    @Override
    public void setSequence(ArrayList sequence) {        
    	this.bmw.setSequence(sequence);    
    }
}

E. 지휘자: 건축 자 대상 중의 부품 구조 와 조립 방법 을 호출 하여 복잡 한 대상 의 생 성 을 완성 하고 지휘자 에서 구체 적 인 제품 의 정 보 를 언급 하지 않 는 다.
public class Director {
    private ArrayList sequence = new ArrayList();
    private BenzBuilder benzBuilder = new BenzBuilder();
    private BMWBuilder bmwBuilder = new BMWBuilder();
    /**
     * A        , start,  stop,       ,      
     */
    public BenzModel getABenzModel() {
        //    ,                
        this.sequence.clear();
        //  ABenzModel     
        this.sequence.add("start");        
        this.sequence.add("stop");
        //           
        this.benzBuilder.setSequence(this.sequence);
        return (BenzModel) this.benzBuilder.getCarModel();
    }
    /**
     * B        ,      ,    ,    ,    
     */
    public BenzModel getBBenzModel() {
        this.sequence.clear();             
        this.sequence.add("engine boom");        
        this.sequence.add("start");
        this.sequence.add("stop");        
        this.benzBuilder.setSequence(this.sequence);
        return (BenzModel) this.benzBuilder.getCarModel();
    }
    /**
     * C            (   ),    ,    
     */
    public BMWModel getCBMWModel() {
        this.sequence.clear();             
        this.sequence.add("alarm");        
        this.sequence.add("start");
        this.sequence.add("stop");        
        this.bmwBuilder.setSequence(this.sequence);
        return (BMWModel) this.bmwBuilder.getCarModel();
    }
    /**
     * D            ,   ,      ,     ,  
     */
    public BMWModel getDBMWModel() {
        this.sequence.clear();        
        this.sequence.add("start");        
        this.bmwBuilder.setSequence(this.sequence);
        return (BMWModel) this.bmwBuilder.getCarModel();
    }
    /**
     *           ,      ,     ,        ,    
     *     ,            
     */
}

F. 클 라 이언 트 호출
public class CarBuilderClient {
    public static void main(String[] args) {
        Director director = new Director();
        //12 A      
        for (int i = 0; i < 12; i++) {            
        	director.getABenzModel().run();        
        }
        //12W B      
        for (int i = 0; i < 12; i++) {            
        	director.getBBenzModel().run();        
        }
        //12 C      
        for (int i = 0; i < 12; i++) {            
        	director.getCBMWModel().run();        
        }
        //12 D      
        for (int i = 0; i < 12; i++) {            
        	director.getDBMWModel().run();        
        }
    }
}

좋은 웹페이지 즐겨찾기