工厂方法模式

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

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

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

使用场景

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. CCScrollView/CCTableView(CCTableViewDelegate CCTableViewDataSource CCTableView-滑动列表-游戏中大量使用 非常重要的一个类)

    tableview scrollViewDidScroll函数中有一段   ----  即---滑动tableview时触发的函数 : 会将全部显示的cell又一次刷新(刷新函数中调用了自己定义的ta ...

  2. android环境部署(1.1)

    前言 对于android文件的解释和说明下载,这里分享一个博客大家了解吧.这里作者提供的下载地址可能有无效的,关键是解析..... 转自:http://www.cnblogs.com/bjzhangh ...

  3. Android中如何实现多行、水平滚动的分页的Gridview?

    功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Grid ...

  4. 一款基于jQuery的仿百度首页滑动选项卡

    今天给大家分享一款基于jQuery的仿百度首页滑动选项卡.这款选项卡适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: 在线预览   ...

  5. Booting ARM Linux

    来源:linux-2.6.30.4/Documentation/arm/Booting ARM Linux Booting ARM Linux            ================= ...

  6. ngrok 2016版

    1. 先到http://www.ngrok.cc/下载客户端 2.进管理页面 注册登录 3.绑定域名 新增: 复制客户端id 打开该目录 按住shift 右键->在此处打开命令窗口 输入 sta ...

  7. C#.NET使用AnimateWindow制作淡入淡出特殊效果的窗体

    使用AnimateWindow制作淡入淡出效果的窗体 命名空间: using System.Runtime.InteropServices; API函数: [DllImport("user3 ...

  8. python3.x爬取美团信息

    在之前的文章中,笔者有提到,我们要在实践中去学习python,笔者有天就想着要不要爬点东西呢,跃跃欲试的节奏啊,想来想去,想到美团了,那么首先笔 者想给自己确定一个目标,就是我要爬什么样的数据,我要爬 ...

  9. Specialized Four-Digit Numbers

    Problem Description Find and list all four-digit numbers in decimal notation that have the property ...

  10. UVa OJ 10300

    Problem A Ecological Premium Input: standard input Output: standard output Time Limit: 1 second Memo ...