iOS App 디자인 모델 개발 에서 향 원 모델 에 대한 활용
대상 을 대상 으로 하 는 소프트웨어 디자인 에서 공공 대상 을 이용 하면 자원 을 절약 할 수 있 을 뿐만 아니 라 성능 도 향상 시 킬 수 있다.공 유 된 대상 은 내 재 된 정보 만 제공 할 수 있 을 뿐 대상 을 식별 하 는 데 사용 할 수 없다.공유 가능 한 대상 을 디자인 하 는 데 사용 되 는 디자인 모델 을 향 원 모델(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)응용 프로그램 은 대상 표시 에 의존 하지 않 습 니 다.공유 대상 이 유일한 표 시 를 제공 할 수 없 기 때 문 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.