iOS App 디자인 모델 개발 에서 향 원 모델 에 대한 활용

7637 단어 iOS디자인 모드
향 원 모델 의 개념
대상 을 대상 으로 하 는 소프트웨어 디자인 에서 공공 대상 을 이용 하면 자원 을 절약 할 수 있 을 뿐만 아니 라 성능 도 향상 시 킬 수 있다.공 유 된 대상 은 내 재 된 정보 만 제공 할 수 있 을 뿐 대상 을 식별 하 는 데 사용 할 수 없다.공유 가능 한 대상 을 디자인 하 는 데 사용 되 는 디자인 모델 을 향 원 모델(Flyweight pattern)이 라 고 한다.
향 원 모드 를 실현 하려 면 두 개의 관건 적 인 구성 요소 가 필요 합 니 다.보통 공유 할 수 있 는 향 원 대상 과 저장 할 수 있 는 연못 입 니 다.중앙 대상 이 이 풀 을 지 키 고 적당 한 인 스 턴 스 를 되 돌려 줍 니 다.
공유 기술 을 활용 하여 대량의 입자 도 를 효과적으로 지원 하 는 대상.
대중 교통(예 를 들 어 버스)은 이미 백 여 년 의 역 사 를 가지 고 있다.같은 방향 으로 가 는 승객 들 은 차량(예 를 들 어 버스)을 운영 하 는 비용 을 나 눌 수 있다.버스 는 여러 개의 플랫폼 이 있 고 승객 들 은 노선 을 따라 그들의 목적지 에 가 까 운 곳 에서 내 렸 다.목적지 에 도착 하 는 비용 은 단지 여정 과 관계 가 있다.보유 차량 에 비해 버스 를 타 는 것 이 훨씬 싸다.이것 이 바로 공공 자원 을 이용 하 는 장점 이다.
대상 을 대상 으로 하 는 소프트웨어 디자인 에서 우 리 는 공공 대상 을 이용 하면 자원 을 절약 할 수 있 을 뿐만 아니 라 성능 도 향상 시 킬 수 있다.예 를 들 어 어떤 인물 은 하나의 100 만 개의 인 스 턴 스 가 필요 하지만 우 리 는 이런 인 스 턴 스 를 모두 에 게 공유 할 수 있 고 특정한 독특한 정 보 를 외부 에 두 면 절 약 된 자원 이 상당히 상당 할 수 있다(하나의 인 스 턴 스 와 100 만 개의 인 스 턴 스 의 차이).공 유 된 대상 은 내 재 된 정보 만 제공 하고 대상 을 식별 할 수 없다.공유 대상 을 디자인 하 는 데 사용 되 는 디자인 모델 을 향 원 모델 이 라 고 한다.
향 원 대상 을 경량급 으로 만 드 는 가장 중요 한 이 유 는 무엇 일 까?그것들의 크기 가 아니 라 공 유 를 통 해 절약 할 수 있 는 공간 총량 이다.일부 대상 의 독특한 상 태 는 외부 로 가 져 가 다른 곳 에서 관리 하고 나머지 부분 은 공유 된다.예 를 들 어 원래 한 가지 유형의 백만 개의 대상 이 필요 하지만 이런 대상 은 향원 이기 때문에 지금 은 하나 면 충분 하 다.공유 가능 한 향원 대상 이 시스템 전 체 를 가볍게 만 드 는 이유 다.꼼꼼 한 설 계 를 통 해 메모리 의 절약 은 매우 볼 만하 다.iOS 개발 에서 메모리 절약 은 전체 성능 을 향상 시 키 는 것 을 의미한다.
향 원 모드 의 실례 응용
    저 희 는 WebSiteFactory 공장 류 를 만들어 서 연못 의 향 원 대상 을 유지 하고 부모 유형 에 따라 각종 유형의 구체 적 인 향 원 대상 을 되 돌려 줍 니 다.코드 는 다음 과 같 습 니 다.

#import <Foundation/Foundation.h>
#import "WebSiteProtocol.h"
@interface WebSiteFactory : NSObject
 
@property (nonatomic, strong) NSDictionary *flyweights; //
 
- (id<WebSiteProtocol>)getWebSiteCategory:(NSString *)webKey;
- (NSInteger)getWebSiteCount;
 
@end

#import "WebSiteFactory.h"
#import "ConcreteWebSite.h"
@implementation WebSiteFactory
 
- (instancetype)init {
    self = [super init];
    if (self) {
        _flyweights = [NSDictionary dictionary];
    }
    return self;
}
 
- (id<WebSiteProtocol>)getWebSiteCategory:(NSString *)webKey {   
    __block id<WebSiteProtocol> webset = nil;
    [self.flyweights enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        if (webKey == key) {
            webset = obj;
            *stop = YES;
        }
    }];
    
    if (webset == nil) {
        ConcreteWebSite *concreteWebset = [[ConcreteWebSite alloc] init];
        concreteWebset.webName = webKey;
        webset = concreteWebset;
        
        NSMutableDictionary *mutabledic = [NSMutableDictionary dictionaryWithDictionary:self.flyweights];
        [mutabledic setObject:webset forKey:webKey];
        self.flyweights = [NSDictionary dictionaryWithDictionary:mutabledic];
    }
    
    return webset;
}
 
- (NSInteger)getWebSiteCount {
    return self.flyweights.count;
}
 
@end
    코드 중의 getWebSiteCategory 방법 은 구체 적 인 메타 대상 을 되 돌려 줄 수 있 습 니 다.돌아 오 는 이 메타 대상 은 웹 사이트 프로 토 콜 의 협 의 를 동시에 지 킬 수 있 습 니 다.웹 사이트 프로 토 콜 의 코드 는 다음 과 같 습 니 다.

#import <Foundation/Foundation.h>
#import "User.h"
@protocol WebSiteProtocol <NSObject>
 
- (void)use:(User *)user;
 
@end
    Concrete 웹 사이트 의 코드 는 다음 과 같 습 니 다.

#import <Foundation/Foundation.h>
#import "WebSiteProtocol.h"
@interface ConcreteWebSite : NSObject <WebSiteProtocol>
 
@property (nonatomic, copy) NSString *webName;
 
@end

#import "ConcreteWebSite.h"
 
@implementation ConcreteWebSite
 
- (void)use:(User *)user {
    NSLog(@" :%@ :%@", self.webName, user.userName);
}
 
@end
    User 의 코드 는 다음 과 같 습 니 다.

#import <Foundation/Foundation.h>
 
@interface User : NSObject
 
@property (nonatomic, copy) NSString *userName;
 
@end

#import "User.h"
 
@implementation User
 
@end
    이로써 향 원 모드 의 코드 가 완성 되 었 습 니 다.클 라 이언 트 에서 향 원 모드 를 어떻게 사용 하 는 지 보 겠 습 니 다.코드 는 다음 과 같 습 니 다.

#import "ViewController.h"
#import "WebSiteProtocol.h"
#import "WebSiteFactory.h"
#import "ConcreteWebSite.h"
#import "User.h"
typedef id<WebSiteProtocol> WebsiteType;
@interface ViewController ()
 
@end

@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    // ,
    WebSiteFactory *factory = [[WebSiteFactory alloc] init];
    
    //
    WebsiteType type1 = [factory getWebSiteCategory:@" "];
    User *user1 = [[User alloc] init];
    user1.userName = @" ";
    // use
    [type1 use:user1];
    
    WebsiteType type2 = [factory getWebSiteCategory:@" "];
    User *user2 = [[User alloc] init];
    user2.userName = @" ";
    [type2 use:user2];
    
    WebsiteType type3 = [factory getWebSiteCategory:@" "];
    User *user3 = [[User alloc] init];
    user3.userName = @" ";
    [type3 use:user3];
    
    NSInteger count = [factory getWebSiteCount];
    NSLog(@" : %ld", (long)count);
    
}
 
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
@end
    출력 은 다음 과 같 습 니 다:

2015-09-12 15:59:55.322 FlyweightPattern[42020:1723017]     :       :  
2015-09-12 15:59:55.322 FlyweightPattern[42020:1723017]     :       :  
2015-09-12 15:59:55.322 FlyweightPattern[42020:1723017]     :       :  
2015-09-12 15:59:55.323 FlyweightPattern[42020:1723017]   : 3
    같은 자원 을 공유 하여 임 무 를 수행 하 는 것 은 개인의 자원 을 이용 하여 같은 일 을 완성 하 는 것 보다 더욱 효율 적일 수 있다.향 원 모드 는 일부 필요 한 대상 을 공유 함으로써 대량의 메모 리 를 절약 할 수 있다.
   
향 원 모드 를 언제 사용 합 니까
(1)응용 프로그램 은 많은 대상 을 사용한다.
(2)메모리 에 대상 을 저장 하면 메모리 성능 에 영향 을 줄 수 있다.
(3)대상 의 대부분 특유 상태(외재 상태)는 외부 에 두 고 경 량 화 할 수 있다.
(3)외적 상 태 를 제거 한 후 원래 의 대상 을 비교적 적은 공유 대상 으로 대체 할 수 있다.
(4)응용 프로그램 은 대상 표시 에 의존 하지 않 습 니 다.공유 대상 이 유일한 표 시 를 제공 할 수 없 기 때 문 입 니 다.

좋은 웹페이지 즐겨찾기