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

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

  hot3.png

1. 主要区别

抽象工厂 工厂方法
通过对像组合创建产品 通过类继承来创建产品

生成一系列产品(eg:生成某类view,button,或者其他

生成某一种产品(eg:生成某类view)

必须修改父类接口,才能生成新的产品 子类化创建者并重载工厂方法 以创建新产品
2. 具体的分析(以下代码引用书上面的例子)

2.1 工厂方法

显然,下面的例子中PaperCanvasView和ClothCanvasView继承自CanvasView,通过重载CanvasView的工厂方法而生成了新的一种产品。

@interface CanvasViewGenerator : NSObject - (CanvasView *) canvasViewWithFrame:(CGRect) aFrame;
@implementation PaperCanvasViewGenerator- (CanvasView *) canvasViewWithFrame:(CGRect) aFrame {  return [[[PaperCanvasView alloc] initWithFrame:aFrame] autorelease];}

@implementation ClothCanvasViewGenerator- (CanvasView *) canvasViewWithFrame:(CGRect) aFrame {  return [[[ClothCanvasView alloc] initWithFrame:aFrame] autorelease];}

工厂方法的应用场景:

2.1.1. 编译时无法准备预期要生成的创建的对象的类

2.1.2. 类需要由子类决定运行时生成什么。

2.2 抽象工厂

一样的先上代码:

@interface BrandingFactory : NSObject + (BrandingFactory *) factory;- (UIView *) brandedView;- (UIButton *) brandedMainButton;- (UIToolbar *) brandedToolbar;
@implementation BrandingFactory+ (BrandingFactory *) factory {  #if defined (USE_ACME)    return [[[AcmeBrandingFactory alloc] init] autorelease];  #elif defined (USE_SIERRA)    return [[[SierraBrandingFactory alloc] init] autorelease];  #else    return nil;  #endif}- (UIView *) brandedView {return nil;}- (UIButton *) brandedMainButton {return nil;}- (UIToolbar *) brandedToolbar{return nil;}
显然这里有两个工厂,生成了一系列的产品如 UIView, UIButton,  UIToolbar。而这两个工厂又是由 BrandingFactory产生的。子类需要重写这三个方法才能生成新的产品。

抽象工厂的应用场景:

抽象工厂提供一个固定的接口,用于创建一系列由关联或者相依存的对象,而不必指定其具体类或其创建细节。

(引用书中的例子:虽然每家店的比萨饼不一样,同一家比萨饼也有多种口味,但是制作的基本步骤确实一样的。对于我们,将比萨饼看成一种食物,厨师就像是生成比萨饼的工厂。但实际的产品的细节会有所不同。所以,厨师们都知道制作比萨饼的“通用的”或“抽象”的基本知识,但他们有自己的“实现”或“具体”,因此产生的比萨饼不一样)

转载于:https://my.oschina.net/megan/blog/140699

你可能感兴趣的文章
鸿鹄之志
查看>>
Jquery超简单遮罩层实现代码
查看>>
JavaScript 抛出异常 try..catch
查看>>
29个面向开发人员和设计师的免费iPhone/iPad应用
查看>>
编译时间格式转换dd/mm/yyyy
查看>>
网络安全隐患:频发个人信息泄漏事件
查看>>
windows下pip配置
查看>>
java使用bytebuddy动态生成带泛型的DTO
查看>>
Java方法参数传递
查看>>
c#语言学习 专题二 String
查看>>
java 送信简单实例
查看>>
js图片链接转base64 转dataUrl
查看>>
Maven 编译时发生错误说XX是专有API,可能会在未来的版本中删除
查看>>
Ubuntu 下使用apt-get安装最新版本的MySQL
查看>>
HTML5 Canvas 学习日志(十)
查看>>
windows环境下 curl 安装和使用
查看>>
EventBus用法及源码解析
查看>>
iOS 界面流畅性能优化
查看>>
Tomcat部署项目注意事项,谨防闪退
查看>>
Nacos Committer 张龙:Nacos Sync 的设计原理和规划
查看>>