생 성기 모드 (Builder)

14776 단어 디자인 모드
@ @ 모드 정의:
복잡 한 대상 의 구축 과 그 표 시 를 분리 시 켜 같은 구축 과정 에서 서로 다른 표 시 를 만 들 수 있 도록 한다.
@ @ @ 연습 예시: 
공장 방법 모드 에서 데 이 터 를 내 보 내 는 응용 프레임 워 크 를 계속 합 니 다.
@ @ 예시 코드:
\export\ExportHeaderModel.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;

/**
 *              
 */
public class ExportHeaderModel {
    /**
     *          
     */
	private String depId;
	
	/**
	 *        
	 */
	private String exportDate;

	public String getDepId() {
		return depId;
	}

	public void setDepId(String depId) {
		this.depId = depId;
	}

	public String getExportDate() {
		return exportDate;
	}

	public void setExportDate(String exportDate) {
		this.exportDate = exportDate;
	}
}

\export\ExportDataModel.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;

/**
 *         
 */
public class ExportDataModel {
    /**
     *     
     */
	private String productId;
	
	/**
	 *     
	 */
	private double price;
	
	/**
	 *     
	 */
	private double amount;

	public String getProductId() {
		return productId;
	}

	public void setProductId(String productId) {
		this.productId = productId;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public double getAmount() {
		return amount;
	}

	public void setAmount(double amount) {
		this.amount = amount;
	}
}

\export\ExportFooterModel.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;

/**
 *              
 */
public class ExportFooterModel {
    /**
     *    
     */
	private String exportUser;

	public String getExportUser() {
		return exportUser;
	}

	public void setExportUser(String exportUser) {
		this.exportUser = exportUser;
	}
}

\export\ExportToTxt.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;

import java.util.Collection;
import java.util.Map;

/**
 *            
 */
public class ExportToTxt {
    /**
     *          
     * @param ehm       
     * @param mapData      
     * @param efm       
     */
	public void export(ExportHeaderModel ehm,
			           Map> mapData,
			           ExportFooterModel efm) {
		//              
		StringBuffer buffer = new StringBuffer();
		// 1:           
	    buffer.append(ehm.getDepId() + ", " + ehm.getExportDate() + "
"); // 2: for (String tblName : mapData.keySet()) { // buffer.append(tblName + "
"); // for (ExportDataModel edm : mapData.get(tblName)) { buffer.append(edm.getProductId() + ", " + edm.getPrice() + ", " + edm.getAmount() + "
"); } } // 3: buffer.append(efm.getExportUser()); // , // System.out.println(" :
" + buffer); } }

\export\ExportToXml.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;

import java.util.Collection;
import java.util.Map;

/**
 *      XML    
 */
public class ExportToXml {
	/**
     *      XML  
     * @param ehm       
     * @param mapData      
     * @param efm       
     */
	public void export(ExportHeaderModel ehm,
			           Map> mapData,
			           ExportFooterModel efm) {
		//              
		StringBuffer buffer = new StringBuffer();
		// 1:           
		buffer.append("
"); buffer.append("
"); buffer.append("

"); buffer.append(" " + ehm.getDepId() + "
"); buffer.append(" " + ehm.getExportDate() + "
"); buffer.append("

"); // 2: buffer.append("
"); for (String tblName : mapData.keySet()) { // buffer.append("
"); // for (ExportDataModel edm : mapData.get(tblName)) { buffer.append("
"); buffer.append(" " + edm.getProductId() + "
"); buffer.append(" " + edm.getPrice() + "
"); buffer.append(" " + edm.getAmount() + "
"); buffer.append("

"); } buffer.append("

"); } buffer.append("
"); // 3: buffer.append("

"); buffer.append(" " + efm.getExportUser() + "
"); buffer.append("

"); buffer.append("

"); // , // System.out.println(" XML :
" + buffer); } }

\user\Client.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package user;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import export.ExportDataModel;
import export.ExportFooterModel;
import export.ExportHeaderModel;
import export.ExportToTxt;
import export.ExportToXml;

public class Client {
    public static void main(String[] args) {
    	//       
    	ExportHeaderModel ehm = new ExportHeaderModel();
    	ehm.setDepId("    ");
    	ehm.setExportDate("2013-06-02");
    	
    	Map> mapData = 
    		new HashMap>();
    	Collection col = new ArrayList();
    	
        ExportDataModel edm1 = new ExportDataModel();
        edm1.setProductId("  001 ");
        edm1.setPrice(100);
        edm1.setAmount(80);
        
        ExportDataModel edm2 = new ExportDataModel();
        edm2.setProductId("  002 ");
        edm2.setPrice(108);
        edm2.setAmount(56);
        
        //        
        col.add(edm1);
        col.add(edm2);
        mapData.put("     ", col);
        
        ExportFooterModel efm = new ExportFooterModel();
        efm.setExportUser("   ");
        
        //          
        ExportToTxt toTxt = new ExportToTxt();
        toTxt.export(ehm, mapData, efm);
        
        //      xml  
        ExportToXml toXml = new ExportToXml();
        toXml.export(ehm, mapData, efm);
    }
}

-------------------------------------------------------------
모드 를 사용 하지 않 을 때 존재 하 는 문제: 
서로 다른 출력 형식 에 대해 처리 절 차 는 같 지만 모든 단계 의 구체 적 인 실현 은 다르다.
모든 출력 형식의 파일 내용 을 구축 할 때 이 몇 가지 처리 절 차 를 반복 하고 추출 하여 공공 처리 과정 을 형성 해 야 합 니 다.
앞으로 서로 다른 출력 형식의 요구 가 많 을 수 있 으 므 로 처리 과정 이 변 하지 않 는 상황 에서 서로 다른 출력 형식의 처 리 를 편리 하 게 전환 할 수 있어 야 한다.
모든 형식의 데이터 파일 을 구축 하 는 처리 과정 은 구체 적 인 절차 와 분리 되 어야 합 니 다.
이렇게 하면 처리 과정 을 재 활용 할 수 있 고 서로 다른 출력 형식 을 쉽게 전환 할 수 있다.
-------------------------------------------------------------
\export\Builder.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;

import java.util.Collection;
import java.util.Map;

/**
 *      ,                      
 */
public interface Builder {
   /**
    *        Header  
    * @param ehm       
    */
	public void buildHeader(ExportHeaderModel ehm);
	
	/**
	 *        Body  
	 * @param mapData          
	 */
	public void buildBody(Map> mapData);
	
	/**
	 *        Footer  
	 * @param efm       
	 */
	public void buildFooter(ExportFooterModel efm);
}

\export\TxtBuilder.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;

import java.util.Collection;
import java.util.Map;

/**
 *                   
 */
public class TxtBuilder implements Builder {
	/**
	 *             ,     
	 */
	private StringBuffer buffer = new StringBuffer();
	
	@Override
	public void buildHeader(ExportHeaderModel ehm) {
		 buffer.append(ehm.getDepId() + ", " + ehm.getExportDate() + "
"); } @Override public void buildBody(Map> mapData) { for (String tblName : mapData.keySet()) { // buffer.append(tblName + "
"); // for (ExportDataModel edm : mapData.get(tblName)) { buffer.append(edm.getProductId() + ", " + edm.getPrice() + ", " + edm.getAmount() + "
"); } } } @Override public void buildFooter(ExportFooterModel efm) { buffer.append(efm.getExportUser()); } public StringBuffer getResult() { return buffer; } }

\export\XmlBuilder.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;

import java.util.Collection;
import java.util.Map;

/**
 *        XML         
 */
public class XmlBuilder implements Builder {
	/**
	 *             ,     
	 */
	private StringBuffer buffer = new StringBuffer();
	
	@Override
	public void buildHeader(ExportHeaderModel ehm) {
		buffer.append("
"); buffer.append("
"); buffer.append("

"); buffer.append(" " + ehm.getDepId() + "
"); buffer.append(" " + ehm.getExportDate() + "
"); buffer.append("

"); } @Override public void buildBody(Map> mapData) { buffer.append("
"); for (String tblName : mapData.keySet()) { // buffer.append("
"); // for (ExportDataModel edm : mapData.get(tblName)) { buffer.append("
"); buffer.append(" " + edm.getProductId() + "
"); buffer.append(" " + edm.getPrice() + "
"); buffer.append(" " + edm.getAmount() + "
"); buffer.append("

"); } buffer.append("

"); } buffer.append("
"); } @Override public void buildFooter(ExportFooterModel efm) { buffer.append("

"); buffer.append(" " + efm.getExportUser() + "
"); buffer.append("

"); buffer.append("

"); } public StringBuffer getResult() { return buffer; } }

\export\Director.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;

import java.util.Collection;
import java.util.Map;

/**
 *    ,                     
 */
public class Director {
    /**
     *               
     */
	private Builder builder;
	
	/**
	 *     ,       
	 * @param builder      
	 */
	public Director(Builder builder) {
		this.builder = builder;
	}
	
	/**
	 *                  
	 * @param ehm       
	 * @param mapData      
	 * @param efm       
	 */
	public void construct(ExportHeaderModel ehm,
	           Map> mapData,
	           ExportFooterModel efm) {
		// 1:    Header
	    builder.buildHeader(ehm);
	    // 2:     Body
	    builder.buildBody(mapData);
	    // 3:    Footer
	    builder.buildFooter(efm);
	}
}

\user\Client2.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package user;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import export.Director;
import export.ExportDataModel;
import export.ExportFooterModel;
import export.ExportHeaderModel;
import export.TxtBuilder;
import export.XmlBuilder;

public class Client2 {
    public static void main(String[] args) {
    	//       
    	ExportHeaderModel ehm = new ExportHeaderModel();
    	ehm.setDepId("    ");
    	ehm.setExportDate("2013-06-02");
    	
    	Map> mapData = 
    		new HashMap>();
    	Collection col = new ArrayList();
    	
        ExportDataModel edm1 = new ExportDataModel();
        edm1.setProductId("  001 ");
        edm1.setPrice(100);
        edm1.setAmount(80);
        
        ExportDataModel edm2 = new ExportDataModel();
        edm2.setProductId("  002 ");
        edm2.setPrice(108);
        edm2.setAmount(56);
        
        //        
        col.add(edm1);
        col.add(edm2);
        mapData.put("     ", col);
        
        ExportFooterModel efm = new ExportFooterModel();
        efm.setExportUser("   ");
        
        //          
        TxtBuilder txtBuilder = new TxtBuilder();
        //        
        Director txtDirector = new Director(txtBuilder);
        txtDirector.construct(ehm, mapData, efm);
        //                
        System.out.println("          : 
" + txtBuilder.getResult()); // xml XmlBuilder xmlBuilder = new XmlBuilder(); // Director xmlDirector = new Director(xmlBuilder); xmlDirector.construct(ehm, mapData, efm); // System.out.println(" XML :
" + xmlBuilder.getResult()); } }

@ @ @ 모드 의 실현:
1. 생 성기 의 모든 방법 은 두 가지 기능 이 있 을 수 있 습 니 다. 하 나 는 위 젯 을 만 드 는 대상 이 고 다른 하 나 는 위 젯 을 조립 하 는 것 입 니 다.
2. 지도자 가 맡 은 것 은 전체적인 구축 알고리즘 부분 으로 상대 적 으로 변 하지 않 는 다.
3. 제품 구축 과정 에서 지도자 와 생 성기 사이 에 비교적 복잡 한 상호작용 과정 이 존재 할 수 있다.
4. 클 라 이언 트 는 최종 적 으로 Builder 실현 에서 최종 적 으로 설 치 된 제품 을 가 져 옵 니 다.
5. 일반적으로 제품 에 대해 추상 적 인 인 터 페 이 스 를 정의 할 필요 가 없다. 왜냐하면 최종 적 으로 구 축 된 제품 은 천차만별 이기 때문이다.
@ @ @ 모드 의 기능:
생 성기 모델 의 주요 기능 은 복잡 한 제품 을 구축 하 는 것 이 고 세분 화 되 고 단계별 로 제품 을 구축 하 는 것 이다.
즉, 생 성기 모델 은 복잡 한 대상 을 구성 하 는 문 제 를 한 걸음 한 걸음 해결 하 는 것 이다.
더 중요 한 것 은 이 구축 과정 은 통일 적 이 고 고정 적 이 며 변 화 된 부분 은 생 성기 부분 에 두 었 습 니 다. 서로 다른 생 성 기 를 설정 하면
그러면 같은 구축 과정 에서 서로 다른 제품 을 구축 할 수 있다.
@ @ @ 모드 의 구성:
1. Builder 인 터 페 이 스 는 각 부품 을 어떻게 구축 하고 제품 을 어떻게 조립 하 는 지 정의 합 니 다.
2. Director 는 부품 을 사용 하여 제품 을 조립 하 는 절 차 를 정의 했다.
@ @ @ 모드 의 장점:
1. 느슨 한 결합.
2. 제품 의 내부 표 시 를 쉽게 바 꿀 수 있다.
3. 더 좋 은 재 활용 성
@ @ @ 모드 의 단점:
없다
@ @ 모델 의 본질:
전체 구축 알고리즘 과 부품 구조 과정 을 분리 합 니 다.
@ @ 모델 에 나타 난 디자인 원칙:
없다

좋은 웹페이지 즐겨찾기