一:概念
抽象工廠是工廠方法模式的升級版本皆疹,他用來創(chuàng)建一組相互依賴的對象踩蔚。
二: 應(yīng)用說明
正如DEMO? ?abstractFactoryMode Group 中所說轰绵。
?也就是說當每個抽象產(chǎn)品都有多于一個的具體子類的時候(apple有型號northApple和SouthApple兩種票摇。 而bannana 也有兩種)亥揖,工廠角色怎么知道實例化哪一個子類呢奈梳?這時候我使用了抽象工廠模式杈湾。 抽象的工廠 對應(yīng)于 有多個具體子類的 抽象產(chǎn)品。這也是 抽象工廠 和 普通工廠方法模式的區(qū)別攘须。
工廠方法模式:
一個抽象產(chǎn)品類漆撞,可以派生出多個具體產(chǎn)品類。
一個抽象工廠類阻课,可以派生出多個具體工廠類叫挟。
每個具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實例。
抽象工廠模式:
多個抽象產(chǎn)品類限煞,每個抽象產(chǎn)品類可以派生出多個具體產(chǎn)品類抹恳。
一個抽象工廠類,可以派生出多個具體工廠類署驻。
每個具體工廠類可以創(chuàng)建多個具體產(chǎn)品類的實例奋献。
區(qū)別:
工廠方法模式只有一個抽象產(chǎn)品類健霹,而抽象工廠模式有多個。
工廠方法模式的具體工廠類只能創(chuàng)建一個具體產(chǎn)品類的實例瓶蚂,而抽象工廠模式可以創(chuàng)建多個糖埋。
三:?
抽象產(chǎn)品 Fruit? - > 抽象產(chǎn)品 apple / banana? -> northapple southapple northbanana southBanana
相比
抽象產(chǎn)品 BZ? ?->? 具體產(chǎn)品 BZ550? BZ520 系列。? ?二者的產(chǎn)品線區(qū)別就能看出抽象工廠和普通工廠的區(qū)別了窃这。
下面來介紹抽象工廠 瞳别。 抽象類這里我們使用一個 協(xié)議Protocol 來實現(xiàn)。 在Java 中可以使用 @interface 來實現(xiàn)
#import
@protocolFruit
/**
采集 水果
*/
- (void)get;
@end
然后是 抽象產(chǎn)品? Apple
#import
#import"Fruit.h"
@interfaceApple :NSObject
- (void)get;
@end
還有抽象的產(chǎn)品類 banana
#import
#import"Fruit.h"http:// 水果協(xié)議
@interfaceBanana :NSObject
- (void)get;
@end
具體產(chǎn)品類 我就不列舉了杭攻。
抽象工廠:? 在java 中我們可以使用? @interface 來代替 就是一個接口祟敛。
#import
@protocolFruit;
@protocolFruitFactory
- (id)getApple;
- (id)getBanana;
@end
具體工廠類:
#import
#import"FruitFactory.h"
@interfaceNorthFactory :NSObject
@end
@implementationNorthFactory
- (id)getApple
{
NorthApple*northApple = [[NorthApplealloc]init];
returnnorthApple;
}
- (id)getBanana
{
NorthBanana*northBanana = [[NorthBananaalloc]init];
returnnorthBanana;
}
@end
客戶端調(diào)用代碼:
NorthFactory*northFactory = [[NorthFactory alloc]init];
id northApple = [northFactory getApple];
[northApple get];
id northBanana = [northFactorygetBanana];
[northBanana get];
SouthFactory*southFactory = [[SouthFactory alloc]init];
id southApple = [southFactory getApple];
[southApple get];
id southBanana = [southFactory getBanana];
[southBanana get];
通過這些就可以看出二者的區(qū)別。?