私はビデオとブログのツァットをオンラインで行ってきました。私はすべてを理解したように感じましたが、依然として抽象的な工場パターンを実装するのに苦労しています。ここに私の要求があります:要約工場の方法パターン
- 私はユーザオブジェクトを与えるべきUserクラスを持っています。
- アプリケーションには、サービスプロバイダ(プロバイダ)とサービス受信者(コンシューマ)の2つのタイプのユーザーがあります。
- 名前、電子メールID、携帯電話番号など、これらの2つのタイプのユーザーの共通のプロパティがいくつかあります。プロバイダータイプにはいくつかの追加プロパティがあります。
- プロバイダタイプは、たとえばTaxiDriverまたはRestaurantなど。
このユーザークラスの抽象ファクトリとファクトリメソッドパターンを実装して、アプリケーションをUserモデルから切り離すことができ、アプリケーションがProviderまたはConsumer型のユーザーを必要とするときはいつでも正しいオブジェクトを取得します。
AbstracUserProtocol.h
今2つのサブクラスの消費者が作成した@protocol AbstractUserProtocol
@required
@property(nonatomic, strong) id delegate;
@property(nonatomic, readonly, getter=isExist) BOOL exist;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *emailID;
@property (nonatomic, assign) NSInteger phoneNumber;
-(void)saveUserData;
-(void)retrievUserData;
@end
AbstractUser.h
@interface AbstractUser : NSObject <AbstractUserProtocol>
-(id)initWithType:(UserType)usrType;
@end
AbstractUser.m
@implementation AbstractUser
@synthesize delegate, exist, name, emailID, phoneNumber;
-(id)initWithType:(UserType)usrType
{
self = nil;
if (usrType == kConsumer) {
self = [Consumer alloc]init];
}
else if (usrType == kProvider) {
self = [ProviderFactory alloc] initWithServiceType:TaxiService];
}
return self;
}
-(void)saveUserData {
[NSException raise:NSInternalInconsistencyException
format:@"You have not implemented %@ in %@",
NSStringFromSelector(_cmd), NSStringFromClass([self class])];
}
-(void)retrievUserData {
}
@end
:私がこれまで試したどのような
AbstractUserクラスからのProviderFactoryです。将来的には自分のアプリケーションが別のタクシーのようなビジネスユーザーやレストランの種類をサポートしたい場合はいつでも
Consumer.h
@interface Consumer : AbstractUser
@property (nonatomic, strong) NSString *address;
@end
ProviderFactory.h
@interface ProviderFactory : AbstractUser
-(id)initWithServiceType:(ServiceType)srvType;
@property(nonatomic, strong) NSString *ownerDetails;
@end
だから、私はちょうどクラスを作成する必要がありますProviderFactoryクラスを介してinitを呼び出します。
私のアプローチは、抽象的なファクトリパターンに対して正しいですか?どのような指導も感謝します。
、私はその後、消費者タイプのユーザーを作成しAbstractUserを依頼した場合私に返されるオブジェクトは、AbstractUserProtocol.h(名前、 emialなど)ではなく、 "address"プロパティではありません。例えばconsumerObj.name /emailとして可能な場合、consumberObj.addressは使用できません。クライアントアプリケーションがconsumerObj.addressにアクセスする方法 – SaffronState