您的位置:首页 > 移动开发 > IOS开发

工厂模式-工厂方法

2015-11-22 00:22 288 查看
工厂方法,属于工厂模式,由于在GOF中提出,大家都有所听闻,上一篇可以叫工厂注册的工厂模式,下面总结一下学习心得吧。

Factory Method

定义

既然都是工厂模式,那都是由一个方法提供产品和实例化的产品类型并非确定咯。此变体差别多了一层工厂类的子类,即ConcreteFactory



按图来看Factory与Product还是供client使用,并且都进行了抽象,client层仍然不关心具体类,实例化工厂或是产品具体类型都是交由它们各自的子类完成。Factory管理起有关Poduct的业务需求,即doSomething。

OC实现

场景:集成原有代码的支付,功能增减时尽量少改动文件。从UML与OC结合看,需要文件又变多了,不知道是不是好事。

Product 只声明接口

typedef NS_ENUM(NSInteger,PAY_RESULT)
{
PAY_RESULT_SUCCESS,
PAY_RESULT_FAIL
};
typedef void(^completeHandle)(PAY_RESULT ret);

@interface PTXPoduct : NSObject

-(void)payProduct:(NSString *)orderInfo complete:(completeHandle)complete;
@end


ConcreteProduct负责实现Product接口

@interface PTXAliPayProduct : PTXPoduct

@end

@implementation PTXAliPayProduct

-(void)payProduct:(NSString *)orderInfo complete:(completeHandle)complete
{
NSLog(@"支付 %@ 产品",orderInfo);
if (complete) {
complete(PAY_RESULT_SUCCESS);
}
}
@end


Factory 声明Create接口,可以实现默认状态或不实现;及使用Product的业务接口并实现

@interface PTXFactoryM : NSObject

-(PTXPoduct *)createPoduct;

-(void)payWithOrder:(NSString *)order complete:(completeHandle)complete;

@end

@implementation PTXFactoryM

-(void)payWithOrder:(NSString *)order complete:(completeHandle)complete
{
PTXPoduct *product = [self createPoduct];
[product payProduct:order complete:^(PAY_RESULT ret) {
if (complete) {
complete(ret);
}
}];
}
@end


ConcreteFactory仅实现Create接口来提供ConcreteProdcut

@interface PTXAliFactoryM : PTXFactoryM

@end
@implementation PTXAliFactoryM

-(PTXPoduct *)createPoduct
{
return [PTXAliPayProduct new];
}

@end


Client 使用工厂方法

- (void)viewDidLoad {
[super viewDidLoad];
PTXFactoryM *creator = [PTXAliFactoryM new];
[creator payWithOrder:@"一本书" complete:^(PAY_RESULT ret) {
if (ret == PAY_RESULT_SUCCESS) {
NSLog(@"支付成功");

}
else
{
NSLog(@"支付失败");

}
}];
}


优点缺点

与注册工厂对比,现在自己还是区别不出来优劣,只有项目里面去实践吧

+当增减product也不用动到Factory类

-文件数目变多了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息