iOS 응용 개발 에서 디자인 모델 을 사용 하 는 추상 적 인 공장 모델 을 상세 하 게 설명 합 니 다.
우 리 는 간단 한 공장 모델 의 장점 은 클 라 이언 트 와 구체 적 인 제품 의 의존 을 제거 하 는 것 이 고 단점 은'개방-폐쇄 원칙'을 위반 하 는 것 이다.공장 방법 모델 은 간단 한 공장 모델 의 단점 을 극복 하고 제품 의 설립 업 무 를 구체 적 인 공장 류 에 두 며 각 공장 류 는 하나의 제품 을 만 드 는 것 을 책임 진다.그러나 실제 응용 에서 한 공장 류 가 하나의 제품 만 만 만 드 는 상황 이 매우 적다.보통 한 공장 류 는 일련의 관련 제품 을 만 드 는 것 을 책임 진다.만약 에 우리 가 이런 시스템 을 설계 하려 면 공장 방법 모델 은 응용 수 요 를 만족 시 키 지 못 한다.본 장 에서 소개 하고 자 하 는 추상 적 인 공장 모델 은 일련의 제품 의 건설 문 제 를 잘 해결 할 수 있다.
정의.
"일련의 관련 되 거나 서로 의존 하 는 대상 을 만 드 는 인 터 페 이 스 를 제공 합 니 다.구체 적 인 종 류 를 지정 할 필요 가 없습니다."
최초의 정 의 는(Addison-Wesley,1994)에 나 타 났 다.
구조 도
먼저 위의 구조 도의 몇 가지 역할 에 대해 설명 한다.
AbstractFactory:추상 적 인 공장 인터페이스 에는 모든 제품 이 만 든 추상 적 인 방법 이 포함 되 어야 합 니 다.
Concrete Factory 1 과 Concrete Factory 2:구체 적 인 공장 은 특정한 실현 을 가 진 제품 대상 을 구축한다.
AbstractProductA 와 AbstractProductB:추상 적 인 제품 은 다양한 실현 방식 이 있 을 수 있 습 니 다.
ProductA 1,ProductA 2,ProductB 1 과 ProductB 2:구체 적 인 제품 은 추상 적 인 제품 의 구체 적 인 실현 이다.
구조 도 에서 볼 수 있 듯 이 추상 적 인 공장 방법의 가장 큰 장점 은 제품 시 리 즈 를 편리 하 게 바 꿀 수 있다 는 것 이다(예 를 들 어 id
그러나 추상 적 인 공장 방법 도 단점 이 존재 한다.예 를 들 어 지금 우 리 는 새로운 제품 을 추가 해 야 한다.먼저,우 리 는 세 가지 유형 을 추가 해 야 한다.AbstractProductC,ProductC 1,ProductC 2;또한,우 리 는 세 가지 유형 을 변경 해 야 한다.Abstract Factory,Concrete Factory 1,Concrete Factory 2 는'개방-폐쇄 원칙'에 위배 되 는 것 이 분명 하 다.이것 도 이해 할 수 있다.어떤 디자인 모델 도 완벽 하고 흠 잡 을 데 가 없다.이것 은 마치 세상 에 불 패 의 무공 이 없 는 것 과 같다.우리 가 할 수 있 는 일 은 실제 수요 에서 가능 한 한 변화 점 을 격 리 시 켜 변화 가 발생 할 때 전체 시스템 에 대한 영향 이 가장 적 고 변화 가 가 져 온 변경 과 원가 가 가장 낮다.
예시
먼저 데이터베이스 에 접근 하 는 클래스 구성 도 를 보 여 드 리 겠 습 니 다.
좋 습 니 다.상기 구조 도 를 간단하게 분석 해 보 겠 습 니 다.이 그림 에는 세 개의 독립 된 모듈 이 있 습 니 다.하 나 는 IFactory 인터페이스 이 고 서로 다른 데이터 베 이 스 를 구분 하 는 원칙 으로 부 서 를 추상 적 으로 합 니 다.하 나 는 데이터 베 이 스 를 방문 하 는 서로 다른 부서 이 고 다른 하 나 는 데이터 베 이 스 를 조작 하 는 사람 을 추상 적 으로 합 니 다.아 날로 그 에서 다음 에 보 여 드 려 야 할 두 가지 유형 은 언급 되 지 않 았 습 니 다.하 나 는 User 류 이 고 하 나 는 Department 류 입 니 다.이 두 가지 유형 은 데이터 베이스 데이터 에 대한 포장 이 고 구조 와 직접적인 관계 가 없 기 때문에 나타 나 지 않 았 습 니 다.여기 서 여러분 이 혼란 을 일 으 키 지 않도록 설명 하 겠 습 니 다.사실 마음 을 가 라 앉 히 고 자세히 보면 구조 가 뚜렷 하 다.
하하,다음은 그대로 코드 를 보 여 드 리 겠 습 니 다.
주의:본 논문 의 모든 코드 는 ARC 환경 에서 컴 파일 되 었 습 니 다.
사용자 클래스 인터페이스
#import <Foundation/Foundation.h>
@interface User :NSObject
@property int *ID;
@property NSString *Name;
@end
사용자 클래스 구현
#import "User.h"
@implementation User
@synthesize Name =_Name;
@synthesize ID =_ID;
@end
Department 클래스 인터페이스
#import <Foundation/Foundation.h>
@interface Department:NSObject
@property int *ID;
@property NSString *DeptName;
@end
부서 류 실현
#import "Department.h"
@implementation Department
@synthesize ID =_ID;
@synthesize DeptName =_DeptName;
@end
IDepartment 클래스 인터페이스
#import <Foundation/Foundation.h>
@class Department;
@interface IDepartment :NSObject
-(void)Insert:(Department*)department;
-(Department*)GetDepartment:(int)myId;
@end
IDepartment 클래스 구현
#import "IDepartment.h"
#import "Department.h"
@implementation IDepartment
-(void)Insert:(Department *)department{
return;
}
-(Department*)GetDepartment:(int)myId{
return nil;
}
@end
Sqlserver Department 클래스 인터페이스
#import "IDepartment.h"
@interface SqlserverDepartment:IDepartment
@end
Sqlserver Department 클래스 구현
#import "SqlserverDepartment.h"
@implementation SqlserverDepartment
-(void)Insert:(Department *)department{
NSLog(@" SQL Server Department ");
}
-(Department*)GetDepartment:(int)myId{
NSLog(@" SQL Server ID Department ");
return nil;
}
@end
AccessDepartment 클래스 인터페이스
#import "IDepartment.h"
@interface AccessDepartment:IDepartment
@end
*AccessDepartment 클래스 구현
#import "AccessDepartment.h"
@implementation AccessDepartment
-(void)Insert:(Department *)department{
NSLog(@" Access Department ");
}
-(Department*)GetDepartment:(int)myId{
NSLog(@" Access myId Department ");
return nil;
}
@end
IUser 클래스 인터페이스
#import <Foundation/Foundation.h>
@class User;
@interfaceIUser :NSObject
-(void)Insert:(User*)user;
-(User*)GetUser:(int)myID;
@end
IUser 클래스 구현
#import "IUser.h"
#import "User.h"
@implementation IUser
-(void)Insert:(User *)user{
return;
}
-(User*)GetUser:(int)myID{
return nil;
}
@end
SqlServerUser 클래스 인터페이스
#import "IUser.h"
@interface SqlServerUser :IUser
@end
SqlServerUser
#import "SqlServerUser.h"
@implementation SqlServerUser
-(void)Insert:(User *)user{
NSLog(@" SQL Server User ");
}
-(User*)GetUser:(int)myID{
NSLog(@" SQL Server myID User ");
return nil;
}
@end
AccessUser 클래스 인터페이스
#import "IUser.h"
@interface AccessUser :IUser
@end
AccessUser 클래스 구현
#import "AccessUser.h"
@implementation AccessUser
-(void)Insert:(User *)user{
NSLog(@" Access User ");
}
-(User*)GetUser:(int)myID{
NSLog(@" Access myID User ");
return nil;
}
@end
IFactories 클래스 인터페이스
#import "AccessUser.h"
@implementation AccessUser
-(void)Insert:(User *)user{
NSLog(@" Access User ");
}
-(User*)GetUser:(int)myID{
NSLog(@" Access myID User ");
return nil;
}
@end
IFactories 클래스 구현
#import "IFactories.h"
#import "IUser.h"
#import "IDepartment.h"
@implementation IFactories
-(IUser*)CreateUser{
return nil;
}
-(IDepartment*)CreateDepartment{
return nil;
}
@end
AccessFactory 클래스 인터페이스
#import "IFactories.h"
@interface AccessFactory :IFactories
@end
AccessFactory 클래스 구현
#import "AccessFactory.h"
#import "AccessUser.h"
#import "AccessDepartment.h"
@implementation AccessFactory
-(IUser*)CreateUser{
return [[AccessUser alloc]init];
}
-(IDepartment*)CreateDepartment{
return [[AccessDepartment alloc]init];
}
@end
SqlServerFactory 클래스 인터페이스
#import "IFactories.h"
@interface SqlServerFactory :IFactories
@end
SqlServerFactory 클래스 구현
#import "SqlServerFactory.h"
#import "SqlServerUser.h"
#import "SqlserverDepartment.h"
@implementation SqlServerFactory
-(IUser*)CreateUser{
return [[SqlServerUser alloc]init];
}
-(IDepartment*)CreateDepartment{
return [[SqlserverDepartment alloc]init];
}
@end
메 인 방법 호출
#import <Foundation/Foundation.h>
#import "User.h"
#import "Department.h"
#import "IFactories.h"
#import "AccessFactory.h"
#import "IUser.h"
#import "IDepartment.h"
int main (int argc,const char * argv[])
{
@autoreleasepool{
User *user = [[User alloc]init];
Department *dept = [[Department alloc]init];
IFactories *factories = [[AccessFactory alloc]init];
IUser *iu = [factories CreateUser];
[iu Insert:user];
[iu GetUser:1];
IDepartment *myId = [factories CreateDepartment];
[myId Insert:dept];
[myId GetDepartment:1];
}
return 0;
}
위 에 한 무더기 의 코드 가 나열 되 어 있 는데 사실은 이런 코드 를 나열 하 는 목적 은 오직 하나 이다.바로 나 처럼 기초 가 좋 지 않 은 학생 들 이 빨리 입문 할 수 있 도록 도와 주 고 감성 적 인 인식 을 가지 고 첫 번 째 문턱 을 넘 기 위해 서 이다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.