您的位置:首页 > 其它

设计模式之抽象工厂模式

2015-09-07 11:16 197 查看
关于设计模式找到了一个系列讲的非常到位,也很容易让人理解,这里我也是看下面的博客来理解抽象工厂模式。
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];




通过代码我们能分析出如果增加产品等级那样抽象工厂、具体工厂都要改,这样会很麻烦,如果增加产品族那就很容易。这也是我们使用抽象工厂的优缺点之一。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: