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