工厂方法模式

工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象。

工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到其子类。

工厂方法的工厂其实是多太的一个经典应用,而其生产的产品取决于使用什么工厂,符合面向对象设计的开放封闭原则,添加产品只需要添加新的类,而不需要修改原有的代码。

使用场景

1.编译时无法准确预期要创建的对象的类;

2.类想让其子类决定在运行时创见什么;

3.类有若干辅助类为其子类,而你想返回那个子类这一信息局部化。

举个最简单的例子,NSNumber这个类,可以使用[[NSNumber alloc] init]来创建实例,但是并没有什么用,除非使用预先定义的工厂方法才有用,

例如:[NSNumber numberWithBool:YES]消息会得到NSNumber的子类NSCFBoolean的一个实例。

创建对象的安全方法

因为客户端并不需要创建对象的实现细节,细节都会在工厂方法中得到实现,并且返回最终的产品,如果想要添加新的产品,不需要修改客户端接口,只需要修改工厂方法即可。

对象工厂方法和类工厂方法

个人觉得类工厂方法其实就是简单工厂的一种体现,只需要调用不同的方法或者传递不同的参数来实例化不同的子类。但是这种方法每次添加新产品时都要在抽象类中添加对应的方法,并不符合开放封闭原则,对象工厂方法模式只需要添加新的类就可以实现我们想要的效果。

Demo

内容比较多:

工厂类

#import <Foundation/Foundation.h>

@interface Factory : NSObject

-(id)createProduct;

@end

#import "Factory.h"
#import "Product.h"
@implementation Factory -(id)createProduct{
return [[Product class] new];
} @end
#import "Factory.h"

@interface FactoryType1 : Factory

@end

#import "FactoryType1.h"
#import "ProductType1.h"
@implementation FactoryType1 -(id)createProduct{
return [[ProductType1 class] new];
} @end #import "Factory.h" @interface FactoryType2 : Factory @end #import "FactoryType2.h"
#import "ProductType2.h" @implementation FactoryType2 -(id)createProduct{
return [[ProductType2 class] new];
} @end

产品类

#import <Foundation/Foundation.h>

@interface Product : NSObject

@property(nonatomic, strong) NSString *name;

@end

#import "Product.h"

@implementation Product

-(id)init{
if(self){
_name = @"product";
}
return self;
} @end #import "Product.h" @interface ProductType1 : Product @end #import "ProductType1.h" @implementation ProductType1 -(id)init{
if(self){
self.name = @"productType1";
}
return self;
} @end #import "Product.h" @interface ProductType2 : Product @end #import "ProductType2.h" @implementation ProductType2 -(id)init{
if(self){
self.name = @"productType2";
}
return self;
} @end

客户端:

        Factory *factory1 = [FactoryType1 new];
Product *product1 = [factory1 createProduct];
NSLog(@"%@",product1.name); Factory *factory2 = [FactoryType2 new];
Product *product2 = [factory2 createProduct];
NSLog(@"%@",product2.name);
return ;
/*
*2015-07-19 22:11:13.590 Factory Methods[32054:8351400] productType1
*2015-07-19 22:11:13.591 Factory Methods[32054:8351400] productType2
*/

可以看到,打印结果,我们只改变了初始化子类,对应就产生出了不同的产品。

对于类工厂方法就不做演示了,可以参看NSNumber

Objective-C设计模式——工厂方法模式virtual constructor(对象创建)的更多相关文章

  1. Java设计模式-工厂方法模式(Virtual Constructor/Polymorphic Factory)

    工厂方法模式(Virtual Constructor/Polymorphic Factory) 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性工厂 ...

  2. 4. 星际争霸之php设计模式--工厂方法模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. C++设计模式——工厂方法模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...

  4. 我的Java设计模式-工厂方法模式

    女朋友dodo闹脾气,气势汹汹的说"我要吃雪糕".笔者心里啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?! 但是,雪糕买回来了,她竟然说"不想吃雪糕了,突然想吃披萨" ...

  5. javascript设计模式-工厂方法模式

    工厂方法模式笔记  通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例  对于创建多类对象,简单工厂不太实用,这是简单工厂模式的应用局限,当然这正是工厂方法模式的价值之所在  通过工厂方法模 ...

  6. 设计模式-工厂方法模式(FactoryMethod)

    工厂方法模式又称多态工厂模式.工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactor ...

  7. 深入浅出设计模式——工厂方法模式(Factory Method)

    介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...

  8. 设计模式——工厂方法模式(Factory Method)

    原文地址:http://www.cnblogs.com/Bobby0322/p/4179921.html 介绍 在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计 ...

  9. JAVA设计模式--工厂方法模式

    工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...

随机推荐

  1. Codeforces Round #189 (Div. 1) B. Psychos in a Line 单调队列

    B. Psychos in a Line Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/p ...

  2. cocos2d-x 3.1.1 学习笔记[3]Action 动作

    这些动画貌似都非常多的样子,就所有都创建一次. 代码例如以下: /* 动画*/ auto sp = Sprite::create("card_bg_big_26.jpg"); Si ...

  3. 如何进行js动态生成option?如何实现二级连动?

    何为二级连动? 首先要明白什么是二级连动!顾名思义,就是一个动,另外一个也跟着一起动 看下面的例子: 这里有一个“市级”的选择列表框,还有一个“县级”的选择列表框,如果“市级”的选择列表框中的值发现变 ...

  4. C# Redis分布式缓存

    C# Redis实战(七) 七.修改数据 在上一篇 C# Redis实战(六)中介绍了如何查询Redis中数据,本篇将介绍如何修改Redis中相关数据.大家都知道Redis是key-value型存储系 ...

  5. iOS开发——开发必备OC篇&UITableView设置界面完整封装(二)

    UITableView设置界面完整封装(二) 简单MVC实现UITableView设置界面之Cell右边类型设置 首先来看看第一种方法证明使用,结合两种方法之后根据个人的爱好去选择就可以了, 一:使用 ...

  6. h5 -1

    <header></header> 页眉 主要用于页面的头部的信息介绍,也可用于板块头部 <hgroup></hgroup> 页面上的一个标题组合 一个 ...

  7. Trace、Debug和TraceSource的使用以及日志设计 .

    [-] Trace 和 Debug区别 什么是Listeners 跟踪开关 使用BooleanSwitch开关 使用TraceSwitch开关 使用TraceSource代替Trace和Debug 设 ...

  8. 使用getUserMedia 调用摄像头

    html5中一个有趣的 API,能够调用电脑的摄像头,结合 <video> 标签和 Canvas 就能在浏览器中拍摄照片了. 这里需要注意: 因为安全问题, chrome 对于本地文件禁用 ...

  9. javascript冷知识

    本人很少写博客,所以文笔很不好,如果解释的不够清楚的,欢迎点评 1.+号(一元加操作符): 如果放在数值前的话,对数值不会产生任何影响,不过放在其他的数据类型前面的话,就等于调用number()将他转 ...

  10. 1.7.4 Query Syntax and Parsing

    1. 查询语法和解析 这部分主要说明了如何指定被使用的查询解析器.同样描述了主查询解析器的支持的语法和功能.同时还描述了在特定环境下使用的其他查询解析器.这里有一些普通查询解析器都能使用的参数,将会在 ...