我在线浏览了几个视频和博客。感觉就像我理解了一切,但仍然在努力实现抽象工厂模式。这是我的要求:
我想为此用户类实现抽象工厂和工厂方法模式,以便应用程序可以与用户模型分离,并且每当应用程序需要类型为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类初始化。
我的方法是否适用于抽象工厂模式?感谢任何指导。
答案 0 :(得分:0)
根据您的跟进问题,我编辑了答案。
我不完全确定您需要使用AbstractFactory
来完成您想要完成的任务。 AbstractFactory
的基础是它允许你
提供用于创建相关或从属系列的界面 没有指定具体类的对象(Gamma等人)
以Gamma等人的设计模式:可重用面向对象软件的元素为例。假设您正在创建一个工具包来为文档编辑器构建用户界面。您可能有一些小部件对象,如滚动条,按钮,工具栏等。但您可能希望稍后为文档编辑器添加不同的外观。那么你可以使用AbstractFactory
提供一个界面来创建所有的小部件产品(即createScrollbar
,createButtons
等等),然后改变外观,你子类化抽象类并覆盖方法,以便说,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