iOS 응용 개발 에서 디자인 모델 을 사용 하 는 추상 적 인 공장 모델 을 상세 하 게 설명 합 니 다.

10284 단어 iOS디자인 모드
개술
우 리 는 간단 한 공장 모델 의 장점 은 클 라 이언 트 와 구체 적 인 제품 의 의존 을 제거 하 는 것 이 고 단점 은'개방-폐쇄 원칙'을 위반 하 는 것 이다.공장 방법 모델 은 간단 한 공장 모델 의 단점 을 극복 하고 제품 의 설립 업 무 를 구체 적 인 공장 류 에 두 며 각 공장 류 는 하나의 제품 을 만 드 는 것 을 책임 진다.그러나 실제 응용 에서 한 공장 류 가 하나의 제품 만 만 만 드 는 상황 이 매우 적다.보통 한 공장 류 는 일련의 관련 제품 을 만 드 는 것 을 책임 진다.만약 에 우리 가 이런 시스템 을 설계 하려 면 공장 방법 모델 은 응용 수 요 를 만족 시 키 지 못 한다.본 장 에서 소개 하고 자 하 는 추상 적 인 공장 모델 은 일련의 제품 의 건설 문 제 를 잘 해결 할 수 있다.
정의.
"일련의 관련 되 거나 서로 의존 하 는 대상 을 만 드 는 인 터 페 이 스 를 제공 합 니 다.구체 적 인 종 류 를 지정 할 필요 가 없습니다."
최초의 정 의 는(Addison-Wesley,1994)에 나 타 났 다.
구조 도
2016330144055609.png (874×521)
먼저 위의 구조 도의 몇 가지 역할 에 대해 설명 한다.
AbstractFactory:추상 적 인 공장 인터페이스 에는 모든 제품 이 만 든 추상 적 인 방법 이 포함 되 어야 합 니 다.
Concrete Factory 1 과 Concrete Factory 2:구체 적 인 공장 은 특정한 실현 을 가 진 제품 대상 을 구축한다.
AbstractProductA 와 AbstractProductB:추상 적 인 제품 은 다양한 실현 방식 이 있 을 수 있 습 니 다.
ProductA 1,ProductA 2,ProductB 1 과 ProductB 2:구체 적 인 제품 은 추상 적 인 제품 의 구체 적 인 실현 이다.
구조 도 에서 볼 수 있 듯 이 추상 적 인 공장 방법의 가장 큰 장점 은 제품 시 리 즈 를 편리 하 게 바 꿀 수 있다 는 것 이다(예 를 들 어 idfactory=[[Concrete Factory 1 alloc]init].Concrete Factory 1 을 Concrete Factory 2 로 바 꾸 면 ProductA 2 와 ProductB 2 를 만 들 수 있다).또한 추상 적 인 공장 방법 은 구체 적 인 창설 실례 과정 과 클 라 이언 트 를 분리 시킨다.클 라 이언 트 는 그들의 추상 적 인 인터페이스 조작 실례 를 통 해 제품 의 구체 적 인 유형 도 구체 적 인 공장 의 실현 에 의 해 분리 되 고 고객 코드 에 나타 나 지 않 는 다(예 를 들 어 idproduct=[factory createProductA].클 라 이언 트 는 구체 적 인 유형 명 이 ProductA 1 인지 ProductA 2 인지 전혀 모른다.
그러나 추상 적 인 공장 방법 도 단점 이 존재 한다.예 를 들 어 지금 우 리 는 새로운 제품 을 추가 해 야 한다.먼저,우 리 는 세 가지 유형 을 추가 해 야 한다.AbstractProductC,ProductC 1,ProductC 2;또한,우 리 는 세 가지 유형 을 변경 해 야 한다.Abstract Factory,Concrete Factory 1,Concrete Factory 2 는'개방-폐쇄 원칙'에 위배 되 는 것 이 분명 하 다.이것 도 이해 할 수 있다.어떤 디자인 모델 도 완벽 하고 흠 잡 을 데 가 없다.이것 은 마치 세상 에 불 패 의 무공 이 없 는 것 과 같다.우리 가 할 수 있 는 일 은 실제 수요 에서 가능 한 한 변화 점 을 격 리 시 켜 변화 가 발생 할 때 전체 시스템 에 대한 영향 이 가장 적 고 변화 가 가 져 온 변경 과 원가 가 가장 낮다.
예시
먼저 데이터베이스 에 접근 하 는 클래스 구성 도 를 보 여 드 리 겠 습 니 다.
2016330144510330.jpg (557×436)
좋 습 니 다.상기 구조 도 를 간단하게 분석 해 보 겠 습 니 다.이 그림 에는 세 개의 독립 된 모듈 이 있 습 니 다.하 나 는 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;
}

위 에 한 무더기 의 코드 가 나열 되 어 있 는데 사실은 이런 코드 를 나열 하 는 목적 은 오직 하나 이다.바로 나 처럼 기초 가 좋 지 않 은 학생 들 이 빨리 입문 할 수 있 도록 도와 주 고 감성 적 인 인식 을 가지 고 첫 번 째 문턱 을 넘 기 위해 서 이다.

좋은 웹페이지 즐겨찾기