디자인 모델 - 건 류 신기 의 건설 자 모델
우 리 는 모두 디자인 모델 이 창설 형, 구조 형 과 행위 형 으로 나 뉜 다 는 것 을 안다.창설 형 에는 단일 모델, 공장 모델, 건설 자 모델 과 원형 모델 이 있다.
오늘 우 리 는 또 다른 자주 사용 하 는 창설 형 디자인 모델, Builder 모델, 중국 어 를 건설 자 모델 이나 구축 자 모델 로 번역 하고 생 성기 모델 이 라 고도 부른다.
많은 블 로그 가 정리 한 건설 자 모델 에 대한 역할 은 복잡 한 대상 을 만 들 때 건설 자 모델 로 클 라 이언 트 가 제품 내부 로 구 성 된 세부 사항 을 알 필요 가 없 게 하 는 것 이다.이것 은 매우 중요 한 특징 이지 만 또 하나의 특징 과 작용 은 많은 사람들 이 모른다.우 리 는 이어서 잘 토론 할 것 이다.
건설 자 모델 의 역할
평소 개발 에서 대상 을 만 드 는 데 가장 많이 사용 되 는 방식 은 new 키워드 호출 류 의 구조 함수 로 이 루어 지 는 것 입 니 다.이것 은 가장 간단 하고 자주 사용 되 는 것 이지 만 곰 곰 이 생각해 보면 정말 모든 장면 이 적용 되 는 것 일 까?
장면 분석
:
, :
1.
2.
3.
이 공장 을 정상적으로 운영 하려 면 이 세 구성원 변 수 는 반드시 정확 한 할당 을 받 아야 한다.그렇다면 이때 우리 가 가장 흔히 볼 수 있 는 방법 은 구조 방법 에서 이러한 구성원 변수의 대 가 를 실현 하 는 것 이다.
구성원 변수 가 많 지 않 을 때 상소 에서 말 한 3 개 처럼 아무런 문제 가 없 지만 구성원 변수 가 6 개, 12 개, 심지어 더 많아 지면 현재 의 디자인 방향 을 계속 사용 하면 구조 함수 의 매개 변수 목록 이 길 어 지고 코드 는 가 독성 과 용이 성에 있어 모두 떨어진다.구조 함 수 를 사용 할 때 우 리 는 각 매개 변수의 순 서 를 잘못 알 고 잘못된 매개 변수 값 을 전달 하여 매우 은밀 한 bug 를 초래 하기 쉽다.
해결 방법
이 문 제 를 해결 하 는 방법 은 이미 생각 했 을 것 이다. 그것 은 set () 함수 로 구성원 변수 에 값 을 부여 하여 지루 한 구조 함 수 를 대체 하 는 것 이다.우 리 는 필수 적 인 구성원 변 수 를 우리 의 구조 방법 에 두 고 클래스 대상 을 강제로 만 들 때 작성 해 야 합 니 다.다른 필수 가 아 닌 구성원 변 수 를 set () 함수 로 설정 하여 사용자 가 스스로 작성 하거나 작성 하지 않도록 합 니 다.
이런 코드 는 가 독성 과 용이 성에 있어 서 많이 향상 되 었 다.
도입 구조 모드
우리 가 다음 과 같은 몇 가지 수 요 를 가 질 때 set () 함 수 를 사용 하 는 디자인 사고 가 만족 하지 않 을 수도 있 습 니 다.
4. 567917. 우리 가 방금 말 한 것 은 필수 적 인 구성원 변 수 를 구조 방법 에 넣 는 것 이다.만약 필수 항목 이 매우 많다 면, 그 구조 방법 은 또 우리 가 전에 말 한 그 문제 가 발생 할 것 이다.그러나 우리 가 필수 항목 도 set () 방법 으로 설정 하면 이 필수 항목 들 이 이미 작 성 된 논리 인지 확인 할 곳 이 없습니다
4. 567917. 그 밖 에 설정 항목 간 에 일정한 의존 관계 가 있다 고 가정 한다. 예 를 들 어 사용자 가 직원 목록 을 설정 하면 직원 의 월급 을 명시 적 으로 설정 해 야 한다.또는 배치 항목 간 에 일정한 제약 조건 이 있다. 예 를 들 어 직원 과 임금 은 반드시 일일이 대응 해 야 한다.만약 에 우리 가 현재 의 디자인 방향 을 계속 사용한다 면 이런 설정 항목 간 의 의존 관계 나 제약 조건 의 검증 논 리 는 배치 할 곳 이 없다
4. 567917. 만약 에 우리 가 이 공장 류 대상 의 일부 속성 을 원한 다 면 name 은 변 할 수 없 는 것 이다. 즉, 대상 이 만들어 진 후에 이런 내부 의 속성 치 를 다시 수정 할 수 없다 는 것 이다.이 기능 을 실현 하려 면 외부 에 set () 방법 을 노출 해 서 는 안 된다
이런 문제 들 을 해결 하기 위해 서 건축 자 모델 이 도움 이 되 었 다.
건설 자 를 사용 하여 우리 의 수 요 를 실현 하 다.
저 희 는 검증 논 리 를 Builder 클래스 에 배치 하여 먼저 작성 자 를 만 들 고 set () 방법 으로 작성 자의 변수 값 을 설정 한 다음 에 build () 방법 으로 대상 을 진정 으로 만 들 기 전에 집중 적 인 검 사 를 하고 검증 이 통 과 된 후에 야 대상 을 만 들 수 있 습 니 다.그 밖 에 Factory 의 구조 함 수 를 private 개인 권한 으로 바 꿉 니 다.이렇게 하면 우 리 는 건설 자 를 통 해 Factory 류 대상 을 만 들 수 밖 에 없다.또한 Factory 는 가 변 적 이지 않 은 속성 에 set () 방법 을 제공 하지 않 았 습 니 다. 그러면 우리 가 만 든 대상 은 상대 적 으로 불가 결 합 니 다.코드 는 다음 과 같 습 니 다:
public class Factory {
private String factoryName; //
private List employeeIds; //
private Map salaryMap; //
private List equipmentName; //
//
private Factory(){}
private Factory(Builder builder) {
this.factoryName = builder.factoryName;
this.employeeIds = builder.employeeIds;
this.salaryMap = builder.salaryMap;
this.equipmentName = builder.equipmentName;
}
//... getter ...
// Builder Factory 。
// Builder FactoryBuilder。
public static class Builder {
private String factoryName;
private List employeeIds;
private Map salaryMap;
private List equipmentName;
public Factory build() {
// , 、 、
if (StringUtils.isBlank(factoryName)) {
throw new IllegalArgumentException("...");
}
for(Integer employeeId : employeeIds){
if (salaryMap.get(employeeId) == null) {
throw new IllegalArgumentException("...");
}
}
return new ResourcePoolConfig(this);
}
public Builder setFactoryName(String factoryName) {
if (StringUtils.isBlank(factoryName)) {
throw new IllegalArgumentException("...");
}
this.factoryName = factoryName;
return this;
}
public Builder setEmployeeIds(List employeeIds) {
// 0
if (employeeIds.size() == 0) {
throw new IllegalArgumentException("...");
}
this.employeeIds = employeeIds;
return this;
}
public Builder setSalaryMap(Map salaryMap) {
if (salaryMap.size() == 0) {
throw new IllegalArgumentException("...");
}
this.salaryMap = salaryMap;
return this;
}
public Builder setEquipmentName(List equipmentName) {
//
if (equipmentName.siez() < 2) {
throw new IllegalArgumentException("...");
}
this.minIdle = minIdle;
return this;
}
}
}
// IllegalArgumentException,
List employeeIds = Collections.singletonList(1);
Map salaryMap = Collections.singletonMap(1, 9000);
List equipmentName = Collections.singletonList(" ");
Factory factory = new Factory.Builder()
.setFactoryName(" ")
.setEmployeeIds(employeeIds)
.setSalaryMap(salaryMap)
.setEquipmentName(equipmentName)
.build();
총결산
우 리 는 공장 모델 과 비교 해 보 자. 건설 자 모델 은 건설 자 류 로 하여 금 대상 의 건설 업 무 를 책임 지게 하 는 것 이다.공장 모델 은 공장 류 가 대상 창설 을 책임 지 는 작업 이다.
그럼 그들 사이 에는 어떤 차이 가 있 습 니까?실제로 공장 모델 은 서로 다 르 지만 관련 유형의 대상 (같은 부모 클래스 나 인 터 페 이 스 를 계승 하 는 하위 클래스) 을 만 드 는 데 사용 되 며, 주어진 매개 변수 로 어떤 유형의 대상 을 만 들 지 결정 합 니 다.
건설 자 모드 는 하나의 유형의 복잡 한 대상 을 만 들 고 서로 다른 선택 가능 한 파 라 메 터 를 설정 하여 '맞 춤 형' 으로 서로 다른 대상 을 만 드 는 데 사용 된다.인터넷 상에 서 전형 적 인 예 가 둘 의 차 이 를 잘 설명 했다.
고객 이 한 식당 에 들 어가 주문 을 한다. 우 리 는 공장 모델 을 이용 하여 사용자 의 선택 에 따라 피자, 햄버거, 샐러드 등 다양한 음식 을 만든다.피자 에 있어 사용 자 는 치즈, 토마토, 치즈 등 다양한 재 료 를 맞 출 수 있다. 우 리 는 건축 자 모델 을 통 해 사용자 가 선택 한 재료 에 따라 피 자 를 만든다.
실제로 우 리 는 너무 학원 파 를 원 하지 않 는 다. 공장 모델, 건설 자 모델 을 그렇게 분명하게 나 누 지 않 으 면 안 된다. 우 리 는 모든 모델 이 왜 이렇게 디자인 되 고 어떤 문 제 를 해결 할 수 있 는 지 알 아야 한다.이런 가장 본질 적 인 것 을 알 아야 우 리 는 억지로 옮 기지 않 고 유연 하 게 응용 할 수 있 으 며 심지어 각종 모델 을 혼용 하여 새로운 모델 을 만들어 특정한 장면 의 문 제 를 해결 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.