設(shè)計(jì)模式系列傳送門
iOS設(shè)計(jì)模式(一)之簡單工廠模式
iOS設(shè)計(jì)模式(二)之工廠模式
iOS設(shè)計(jì)模式(三)之抽象工廠模式
1宾添、概念
什么是抽象工廠船惨?
抽象工廠提供一個(gè)固定的接口,用于創(chuàng)建一系列有關(guān)聯(lián)或相依存的對象缕陕,而不必指定其具體類或其創(chuàng)建的細(xì)節(jié)粱锐。客戶端與從工廠得到的具體對象之間沒有耦合扛邑。
抽象工廠與工廠方法模式的區(qū)別
抽象工廠與工廠方法模式在許多方面有很多相似之處怜浅,以至于我們常常搞不清楚應(yīng)該在什么時(shí)候用哪一個(gè)。兩個(gè)模式都用于相同的目的:創(chuàng)建對象而不讓客戶端知曉返回了什么確切的具體對象。
工廠方法
1.通過類繼承創(chuàng)建抽象產(chǎn)品
2.創(chuàng)建一種產(chǎn)品
3.子類化創(chuàng)建并重寫工廠方法來創(chuàng)建新產(chǎn)品抽象工廠
1.通過對象組合創(chuàng)建抽象產(chǎn)品
2.創(chuàng)建多個(gè)系列產(chǎn)品
3.必須修改父類的接口才能支持新的產(chǎn)品工廠模式:每個(gè)抽象產(chǎn)品派生多個(gè)具體產(chǎn)品類恶座,每個(gè)抽象工廠類派生多個(gè)具體工廠類搀暑,每個(gè)具體工廠類負(fù)責(zé)一個(gè)具體產(chǎn)品的實(shí)例創(chuàng)建;
抽象模式:每個(gè)抽象產(chǎn)品派生多個(gè)具體產(chǎn)品類跨琳,每個(gè)抽象工廠派生多個(gè)具體工廠類自点,每個(gè)具體工廠負(fù)責(zé)多個(gè)(一系列)具體產(chǎn)品的實(shí)例創(chuàng)建。
2脉让、結(jié)構(gòu)圖
3桂敛、代碼
其中FruitProtocol、AppleFruit侠鳄、OrangeFruit和之前的工廠模式代碼一樣
AppleFactory.h
#import <Foundation/Foundation.h>
#import "FruitProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface AppleFactory : NSObject
+(id<FruitProtocol>)createFactory;
@end
NS_ASSUME_NONNULL_END
AppleFactory.m
#import "AppleFactory.h"
#import "AppleFruit.h"
@implementation AppleFactory
+(id<FruitProtocol>)createFactory{
AppleFruit *apple = [[AppleFruit alloc] init];
apple.name = @"蘋果";
return apple;
}
@end
OrangeFactory.h
#import <Foundation/Foundation.h>
#import "FruitProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface OrangeFactory : NSObject
+(id<FruitProtocol>)createFactory;
@end
NS_ASSUME_NONNULL_END
OrangeFactory.m
#import "OrangeFactory.h"
#import "OrangeFruit.h"
@implementation OrangeFactory
+(id<FruitProtocol>)createFactory{
OrangeFruit *orange = [[OrangeFruit alloc] init];
orange.name = @"橘子";
return orange;
}
@end
AbstractFactory.h
#import <Foundation/Foundation.h>
#import "FruitProtocol.h"
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger,FactoryType){
FactoryTypeApple,
FactoryTypeOrange,
};
@interface AbstractFactory : NSObject
+(id<FruitProtocol>)initWithType:(FactoryType)type;
@end
NS_ASSUME_NONNULL_END
AbstractFactory.m
#import "AbstractFactory.h"
#import "AppleFactory.h"
#import "OrangeFactory.h"
@implementation AbstractFactory
+(id<FruitProtocol>)initWithType:(FactoryType)type{
id<FruitProtocol> factory;
switch (type) {
case FactoryTypeApple:
factory = [AppleFactory createFactory];
break;
case FactoryTypeOrange:
factory = [OrangeFactory createFactory];
break;
default:
break;
}
return factory;
}
@end
在ViewController.m中調(diào)用
#import "ViewController.h"
#import "AbstractFactory.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
id<FruitProtocol> factory = [AbstractFactory initWithType:FactoryTypeApple];
[factory createProduct];
}
@end