设计模式之抽象工厂模式

本文深入解析抽象工厂模式的概念及其应用,通过苹果与三星生产手机和电脑的例子,采用UML类图直观展示模式实现,并通过代码演示如何创建抽象产品、具体产品、抽象工厂和具体工厂,最后探讨其优缺点。

关于设计模式找到了一个系列讲的非常到位,也很容易让人理解,这里我也是看下面的博客来理解抽象工厂模式。

http://blog.youkuaiyun.com/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];

通过代码我们能分析出如果增加产品等级那样抽象工厂、具体工厂都要改,这样会很麻烦,如果增加产品族那就很容易。这也是我们使用抽象工厂的优缺点之一。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值