关于设计模式找到了一个系列讲的非常到位,也很容易让人理解,这里我也是看下面的博客来理解抽象工厂模式。
http://blog.csdn.net/column/details/loveyun.html?&page=2
理解抽象工厂应先了解产品族、产品等级的概念:
所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的主板、芯片组、CPU组成一个家族,Intel的主板、芯片组、CPU组成一个家族。而这两个家族都来自于三个产品等级:主板、芯片组、CPU。一个等级结构是由相同的结构的产品组成,示意图如下:
UML类图:
根据UML类图,以实现苹果和三星生产手机和电脑为例子来用代码实现。
1.抽象产品
1、抽象手机
#import@protocol ITelephone -(void) getProductInfo;@end
2、抽象电脑
#import@protocol IComputer -(void) getProductInfo;@end
2.具体产品
1、苹果手机
#import#import "ITelephone.h"@interface AppleTelePhone : NSObject @end
#import "AppleTelePhone.h"@implementation AppleTelePhone-(void) getProductInfo{ NSLog(@"苹果手机");}@end
2、苹果电脑
#import#import "IComputer.h"@interface AppleComputer : NSObject @end
#import "AppleComputer.h"@implementation AppleComputer-(void) getProductInfo{ NSLog(@"苹果电脑");}@end
3、三星手机
#import#import "ITelephone.h"@interface SamsungTelePhone : NSObject @end
#import "SamsungTelePhone.h"@implementation SamsungTelePhone-(void) getProductInfo{ NSLog(@"三星手机");}@end
4、三星电脑
#import#import "IComputer.h"@interface SamsungComputer : NSObject @end
#import "SamsungComputer.h"@implementation SamsungComputer-(void) getProductInfo{ NSLog(@"三星电脑");}@end
3.抽象工厂
#import#import "ITelephone.h"#import "IComputer.h"@protocol ElectronicFactory -(id ) productTelephone;-(id ) productComputer;@end
4.具体工厂(产品族)
1、苹果工厂
#import#import "ElectronicFactory.h"@interface AppleFactory : NSObject @end
#import "AppleFactory.h"#import "AppleComputer.h"#import "AppleTelePhone.h"@implementation AppleFactory-(id) productTelephone{ return [[AppleTelePhone alloc]init];}-(id ) productComputer{ return [[AppleComputer alloc]init];}@end
2、三星工厂
#import#import "ElectronicFactory.h"@interface SamsungFactory : NSObject @end
#import "SamsungFactory.h"#import "SamsungTelePhone.h"#import "SamsungComputer.h"@implementation SamsungFactory-(id) productTelephone{ return [[SamsungTelePhone alloc]init]; }-(id ) productComputer{ return [[SamsungComputer alloc]init];}@end
调用 :
idappleFactory=[[AppleFactory alloc]init]; [[appleFactory productComputer] getProductInfo]; [[appleFactory productTelephone]getProductInfo]; id samsungFactory=[[SamsungFactory alloc]init]; [[samsungFactory productComputer] getProductInfo]; [[samsungFactory productTelephone] getProductInfo];
通过代码我们能分析出如果增加产品等级那样抽象工厂、具体工厂都要改,这样会很麻烦,如果增加产品族那就很容易。这也是我们使用抽象工厂的优缺点之一。