设计模式之抽象工厂模式
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、抽象手机
2、抽象电脑
2.具体产品
1、苹果手机
2、苹果电脑
3、三星手机
4、三星电脑
3.抽象工厂
4.具体工厂(产品族)
1、苹果工厂
2、三星工厂
调用 :
通过代码我们能分析出如果增加产品等级那样抽象工厂、具体工厂都要改,这样会很麻烦,如果增加产品族那就很容易。这也是我们使用抽象工厂的优缺点之一。
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];
通过代码我们能分析出如果增加产品等级那样抽象工厂、具体工厂都要改,这样会很麻烦,如果增加产品族那就很容易。这也是我们使用抽象工厂的优缺点之一。
相关文章推荐
- windows安装配置memcache和memcached
- jq滚动到底部自动加载数据实例
- 数据结构之栈 C++实现
- 竞业禁止-股东大会决议解散公司,在形成解散决议但未办理注销手续之前公司董事另设一公司,擅自同公司经营同类业务
- 如何利用Bacon 2D来在Ubuntu平台上制作自己的游戏
- 超级手电筒的项目架构和布局第三课时
- Android 数据存储:五大存储之SharedPreference
- C++ Primer Plus (第6版)笔记心的---开始学习C++
- HTML+CSS+jQuery 纵向导航 && 横向导航 && 消除IE6 BUG && 感悟怎样学习
- ResultSet用法
- UVa725 - Division
- SecureZeroMemory和ZeroMemory的区别
- Oracle优化检查表
- css笔记
- do...while(0)的妙用
- 关于viewpager+fragment中嵌套viewpager+fragment的问题处理:
- SVN学习笔记5 -- SVN服务器的启动
- System.Windows.Forms中的Message Structure
- 操作系统性能监控-磁盘IO
- c语言字符数组与字符串的使用详解