iOS App 디자인 모델 개발 에서 작성 자 모델 에 대한 인 스 턴 스
"복잡 한 대상 의 구축 과 그 표현 을 분리 시 켜 같은 구축 과정 에서 서로 다른 표현 을 만 들 수 있 도록 한다."
이 개념 을 보면 추상 적 이 고 알 아 볼 수 있 지만 무슨 소 용이 있 는 지 모르겠다.우 리 는 위의 정 의 를 이해 하기 위해 예 를 들 었 다.예 를 들 기 전에 우리 먼저 이 디자인 모델 이 무엇 에 쓰 이 는 지 이야기 합 시다.우 리 는 왜 이 모드 를 써 야 합 니까?건설 자 모델 은 복잡 한 대상 을 구축 하 는 과정 과 그 부품 의 결합,즉 과정 과 부품 의 결합 을 책임 진다.예 를 들 어 자동 차 는 매우 복잡 한 대상 으로 많은 부품,바퀴,엔진,의자,차문,오 일 탱크 등 이 있다.그것 의 조립 과정 도 매우 복잡 하 다.(전문가 가 절차 에 따라 조립 해 야 한다)건축 자 모델 은 부품 과 조립 과정 을 분리 하기 위 한 것 이다.마찬가지 로 우리 가 사용 하 는 컴퓨터 도 마찬가지 로 부품 이 많 고 조립 과정 도 복잡 하 다(물론 우리 같은 전문가 들 에 게 복잡 하지 않 을 수도 있다).건설 자 모델 의 가장 큰 장점 은 바로 구축 과정 과 표현 을 분리 시 키 는 것 이다.따라서 한 제품 의 표현 을 바 꾸 려 면 구체 적 인 건설 자 를 다시 정의 하면 된다.벤츠 나 다른 차형 을 조립 할 수도 있 습 니 다.우 리 는 구체 적 인 건설 자(제품 표현 에 사용 되 는 유형)만 다시 정의 하면 됩 니 다.
동기
소프트웨어 시스템 에서 가끔 복잡 한 대상(예 를 들 어 상기 예 에서 의 자동차)의 생 성 을 만 날 수 있 는데 이것 은 보통 몇 부분의 하위 대상 이 일정한 알고리즘(과정)으로 구성 된다.수요 의 변화 로 인해 이 복잡 한 대상 의 각 부분 은 항상 격렬 한 변화 에 직면 하고 있다(예 를 들 어 상기 사례 에서 각종 차형 이 사용 하 는 차문,핸들,엔진 등 은 다르다).그러나 각 부분 을 조합 하 는 알고리즘(과정)은 상대 적 으로 안정 적 이다.
건설 자 모델 은 이러한 수요 에서 탄생 한 것 으로 변화 점(구성 부분)을 봉 하여 같은 구축 과정 이 서로 다른 표현 을 만 들 수 있 도록 한다.
건설 자 모델 은 복잡 한 대상 을 만 드 는 알고리즘 이 이 대상 의 구성 부분 과 그들의 조립 방식 에 독립 되 어야 할 때 적용 되 는 모델 이다.
건축 자 모델 은 제품 류(Product),추상 건축 자 류(Builder),구체 적 인 건축 자 류(Concrete Builder 1,Concrete Builder 2...)와 지휘자 류(Director)를 포함한다.
아래 코드 에서 각 종류의 사용 을 볼 수 있 습 니 다.
PersonBuilder *builder = [[PersonThinBuilder alloc]init];
PersonView *personView = [PersonDirector creatPerson:builder];
그 중에서 PersonBuilder 는 추상 적 인 건축 자 류 이 고 PersonThinBuilder 는 구체 적 인 건축 자 류 이 며 PersonView 는 제품 류 이 고 PersonDirector 는 지휘자 류 이다.코드 로 사용 방법 알 아 보기:
1.구체 적 인 건설 자 를 만든다.
2.지휘 자 는 구체 적 인 건설 자 를 통 해 제품 을 반환 합 니 다.
건설 자 모델 은 공장 방법 모델 과 유사 하 다 고 생각 했 지만 지휘자 류 에 합류 했다.
구조 도
구조 도 를 통 해 알 수 있 듯 이 생 성기 모델 은 두 가지 중요 한 역할 이 있 는데 그것 이 바로 Director(지도자)와 Builder(건설 자)이다.Director 는 Builder 가 무엇 을 만들어 야 하 는 지 알 고 있 고,Builder 는 어떻게 만들어 야 하 는 지 알 고 있다.Director 클래스 에서 구체 적 인 건설 자 ConcreteBuilder 의 대상 을 buildPart 로 지도 하 는 construct 방법 을 정의 합 니 다.Builder 는 추상 적 인 인터페이스(프로 토 콜)입 니 다.이 프로 토 콜 에는 각 부분 을 만 드 는 방법(buildPart)이 포함 되 어 있 습 니 다.실제 제품 을 구축 하 는 데 사 용 됩 니 다.또한 getResult 방법 도 있 습 니 다.클 라 이언 트 에 게 구 축 된 Product 을 되 돌려 줍 니 다.
이렇게 얘 기 하 니까 다 들 추상 적 이지 않 아 요?그럼 우리 생활 의 예 를 들 어 통속 적 으로 말 하 자.예 를 들 어 지금 저 는 고향 에서 집 을 지 으 려 고 합 니 다.먼저 저 는 집 을 어떻게 지 을 지 모 릅 니 다.(벽 을 쌓 고 건축 자가 부족 합 니 다)그리고 저 는 어떻게 디자인 해 야 할 지 모 릅 니 다.(방 을 몇 개 지 을 지,방 의 구조,방 의 창문 을 어떻게 디자인 하 는 지,지도자 가 부족 합 니 다)그래서 저 는 노동자(건설 자)를 찾 아 왔 습 니 다.그들 은 벽 을 쌓 을 것 입 니 다.그리고 나 는 디자이너(지도자)를 찾 아야 한다.그 는 어떻게 디자인 하 는 지 안다.마지막 으로 저 는 노동자(건설 자)가 디자이너(지도자)의 지 도 를 듣 고 어디 에 벽 을 쌓 아야 하 는 지,어디 에 창문 을 설치 해 야 하 는 지 등 을 확보 해 야 합 니 다.그러면 노동자(건설 자)가 집 을 짓 기 시 작 했 습 니 다.이 건설 과정 에서 디자이너(지도자)는 계획 과 명령 만 맡 았 습 니 다.집 을 짓 는 데 성공 한 후,노동자 가 나 에 게 집 을 내 놓 았 다.말하자면 Director(지도자)는 거시적인 측면(과정)을 통제 하고 Builder(건설 자)는 미시적 인 측면(표현)을 통제 하 는 것 을 책임 진다.
다음은 코드 를 통 해 이 구조 도 를 설명 하 겠 습 니 다.
실례
작성 자 모드 의 코드
Product.m(부분 코드):
- (id)init
{
self = [superinit];
if (self)
{
arrParts = [NSMutableArrayarray];
}
returnself;
}
- (void)addPart:(NSString *)part
{
[arrPartsaddObject:part];
}
- (void)show
{
for (NSString *strPart inarrParts)
{
NSLog(@"%@",strPart);
}
}
Builder.h(부분 코드):
@classProduct;
@protocol Builder <NSObject>
- (void)addPartOne;
- (void)addPartTwo;
- (Product *)getResult;
@end
ConcreteBuilder.m(부분 코드):
- (id)init
{
self = [superinit];
if (self)
{
product = [[Productalloc] init];
}
returnself;
}
- (void)addPartOne
{
[productaddPart:@"part one"];
}
- (void)addPartTwo
{
[productaddPart:@"part two"];
}
- (Product *)getResult
{
returnproduct;
}
Director.m( ):
- (void)construct:(id<Builder>)builder
{
[builder addPartOne];
[builder addPartTwo];
}
클 라 이언 트 호출 코드:
Director *director = [[Directoralloc] init];
id<Builder> builder = [[ConcreteBuilderalloc] init];
[director construct:builder];
Product *product = [builder getResult];
[product show];
[builder release];
[director release];
건설 자 모드 를 언제 사용 합 니까? 건설 자 모드 는 다음 과 같은 상황 에 자주 사 용 됩 니 다.
각종 위 젯 과 관련 된 복잡 한 대상 을 만들어 야 합 니 다.대상 을 만 드 는 알고리즘 은 위 젯 의 조립 방식 에 독립 해 야 합 니 다.
구축 과정 은 서로 다른 방식 으로 대상 을 구축 해 야 한다.
PS:FaceBook 의 오픈 소스 애니메이션 프레임 워 크 POP 에서 도 builder pattern 과 유사 한 응용 이 있 습 니 다.
POPAnimatableProperty *animatableProperty = [POPAnimatableProperty propertyWithName:@"property" initializer:^(POPMutableAnimatableProperty *prop) {
prop.writeBlock = ^(id obj, const CGFloat values[]) {
};
prop.readBlock = ^(id obj, CGFloat values[]) {
};
}];
이곳 의 initializer 는 본질 적 으로 builder 입 니 다.단지 명칭 이 다 를 뿐 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.