생 성기 모드 (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("
");
// ,
//
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("
");
}
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. 더 좋 은 재 활용 성
@ @ @ 모드 의 단점:
없다
@ @ 모델 의 본질:
전체 구축 알고리즘 과 부품 구조 과정 을 분리 합 니 다.
@ @ 모델 에 나타 난 디자인 원칙:
없다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.