2016-07-12 12 views
0

私はビデオとブログのツァットをオンラインで行ってきました。私はすべてを理解したように感じましたが、依然として抽象的な工場パターンを実装するのに苦労しています。ここに私の要求があります:要約工場の方法パターン

  1. 私はユーザオブジェクトを与えるべきUserクラスを持っています。
  2. アプリケーションには、サービスプロバイダ(プロバイダ)とサービス受信者(コンシューマ)の2つのタイプのユーザーがあります。
  3. 名前、電子メールID、携帯電話番号など、これらの2つのタイプのユーザーの共通のプロパティがいくつかあります。プロバイダータイプにはいくつかの追加プロパティがあります。
  4. プロバイダタイプは、たとえば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を呼び出します。

私のアプローチは、抽象的なファクトリパターンに対して正しいですか?どのような指導も感謝します。

答えて

0

あなたのフォローアップの質問に基づいて、私は答えを編集しました。

あなたが達成しようとしているものに対してAbstractFactoryを使用する必要があるかどうかは完全にはわかりません。 AbstractFactoryの基本は、それが彼らの具象クラスを指定せずに

関連または依存 オブジェクトの家族を作成するためのインタフェースを提供することができますということである(ガンマら。)

からこの例を見てみましょうデザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素 Gamma et al。たとえば、ドキュメントエディタのユーザーインターフェイスを構築するためのツールキットを作成しているとします。スクロールバー、ボタン、ツールバーなどのウィジェットオブジェクトがたくさんあるかもしれませんが、後で別のルックアンドフィールをドキュメントエディタに追加することができます。したがって、AbstractFactoryを使用してすべてのウィジェットプロダクト(つまりcreateScrollbarcreateButtonsなど)を作成することができますが、ルックアンドフィールを変更するには、抽象クラスをサブクラス化してメソッドをオーバーライドして、 createScrollbarは、3D効果を持つスクロールバーを返します。別のケースでは、抽象クラスをサブクラス化してピンクのスクロールバーを作成します。オプションは無限で、クライアントコードはスクロールバーの外観(クライアントが気にするのはテキストをスクロールするかどうかを気にしません)に気付かないので、クライアントコードに触れることなく将来のルック&フィールを簡単に追加できます。あなたのケースでは

、クライアントは、それはいくつかのケースでは、それはCustomerを必要とするため取得し、いくつかのケースProviderにされAbstractUserどのような気に。したがって、いずれにしても、将来的に新しい種類のユーザーを追加する場合は、クライアントコードを変更する必要があります。つまり、ユーザーの抽象基本クラスを作成し、それをサブクラス化してサブクラスにユーザー固有のプロパティを追加するだけです。ここに私が意味するものの例があります。私の上記の実装を1として

AbstractUser.h

#import <Foundation/Foundation.h> 

@interface AbstractUser : NSObject 

@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; 

@end 

Consumer.h

#import "AbstractUser.h" 

@interface Consumer : AbstractUser 

@property (strong, nonatomic) NSString *address; 

@end 

ViewController.m

#import "ViewController.h" 
#import "Consumer.h" 
#import "Provider.h" 

@interface ViewController() 

@property (strong, nonatomic) Consumer *consumer; 
@property (strong, nonatomic) Provider *provider; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    _consumer = [[Consumer alloc] init]; 
    _provider = [[Provider alloc] init]; 

    self.consumer.name = @"Jason"; 
    self.consumer.address = @"some address"; 

    self.provider.name = @"Stack Overflow"; 

@end 
+0

、私はその後、消費者タイプのユーザーを作成しAbstractUserを依頼した場合私に返されるオブジェクトは、AbstractUserProtocol.h(名前、 emialなど)ではなく、 "address"プロパティではありません。例えばconsumerObj.name /emailとして可能な場合、consumberObj.addressは使用できません。クライアントアプリケーションがconsumerObj.addressにアクセスする方法 – SaffronState

関連する問題