抽象工厂方法模式

时间:2016-07-12 13:18:26

标签: ios objective-c oop design-patterns

我在线浏览了几个视频和博客。感觉就像我理解了一切,但仍然在努力实现抽象工厂模式。这是我的要求:

  1. 我有一个User类,它应该提供一个用户对象。
  2. 我的应用程序中有两种类型的用户,例如服务提供商(Provider)和服务接收者(Consumer)。
  3. 这两类用户之间有一些共同的属性,如姓名,电子邮件ID,手机号码等。对于提供商类型,会有一些额外的属性。
  4. 提供商类型可以是例如TaxiDriver或餐厅等。
  5. 我想为此用户类实现抽象工厂和工厂方法模式,以便应用程序可以与用户模型分离,并且每当应用程序需要类型为Provider或Consumer的用户时,它应该获得正确的对象。

    到目前为止我尝试了什么:

    AbstracUserProtocol.h

    @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类创建了两个子类Consumer和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
    

    因此,如果将来我的应用程序想要支持Taxi和Restaurant类型等其他业务用户,那么我只需创建一个类并通过ProviderFactory类初始化。

    我的方法是否适用于抽象工厂模式?感谢任何指导。

1 个答案:

答案 0 :(得分:0)

根据您的跟进问题,我编辑了答案。

我不完全确定您需要使用AbstractFactory来完成您想要完成的任务。 AbstractFactory的基础是它允许你

  

提供用于创建相关或从属系列的界面   没有指定具体类的对象(Gamma等人)

以Gamma等人的设计模式:可重用面向对象软件的元素为例。假设您正在创建一个工具包来为文档编辑器构建用户界面。您可能有一些小部件对象,如滚动条,按钮,工具栏等。但您可能希望稍后为文档编辑器添加不同的外观。那么你可以使用AbstractFactory提供一个界面来创建所有的小部件产品(即createScrollbarcreateButtons等等),然后改变外观,你子类化抽象类并覆盖方法,以便说,createScrollbar返回具有三维效果的滚动条。在另一种情况下,您将抽象类子类化以创建粉红色滚动条。选项是无穷无尽的,因为您的客户端代码不关心滚动条的样子(所有客户关心的是它是否滚动文本),您可以轻松添加未来的外观而不触及客户端代码。

在您的情况下,客户关心它会获得什么样的AbstractUser因为在某些情况下它需要Customer,在某些情况下需要Provider 。因此,无论哪种方式,如果将来您添加了一种新用户,就必须更改您的客户端代码。

那就是说,我认为最好的方法是创建一个User的抽象基类,然后将其子类化,并将特定于用户的属性添加到子类中。这是我的意思的一个例子。

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