博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之抽象工厂模式
阅读量:5742 次
发布时间:2019-06-18

本文共 2851 字,大约阅读时间需要 9 分钟。

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

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

调用 :

id
appleFactory=[[AppleFactory alloc]init]; [[appleFactory productComputer] getProductInfo]; [[appleFactory productTelephone]getProductInfo]; id
samsungFactory=[[SamsungFactory alloc]init]; [[samsungFactory productComputer] getProductInfo]; [[samsungFactory productTelephone] getProductInfo];

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

 

你可能感兴趣的文章
tmux不自动加载配置文件.tmux.conf
查看>>
经验分享:JavaScript小技巧
查看>>
[MOSEK] Stupid things when using mosek
查看>>
程序实例---栈的顺序实现和链式实现
查看>>
服务的使用
查看>>
Oracle 用户与模式
查看>>
MairDB 初始数据库与表 (二)
查看>>
拥在怀里
查看>>
chm文件打开,有目录无内容
查看>>
whereis、find、which、locate的区别
查看>>
一点不懂到小白的linux系统运维经历分享
查看>>
桌面支持--打不开网页上的pdf附件解决办法(ie-tools-compatibility)
查看>>
nagios监控windows 改了NSclient++默认端口 注意事项
查看>>
干货 | JAVA代码引起的NATIVE野指针问题(上)
查看>>
POI getDataFormat() 格式对照
查看>>
Python 中的进程、线程、协程、同步、异步、回调
查看>>
好的产品原型具有哪些特点?
查看>>
实现java导出文件弹出下载框让用户选择路径
查看>>
刨根问底--技术--jsoup登陆网站
查看>>
OSChina 五一劳动节乱弹 ——女孩子晚上不要出门,发生了这样的事情
查看>>