Objective-C设计模式——工厂方法模式virtual constructor(对象创建)
工厂方法模式
工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象。
工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到其子类。
工厂方法的工厂其实是多太的一个经典应用,而其生产的产品取决于使用什么工厂,符合面向对象设计的开放封闭原则,添加产品只需要添加新的类,而不需要修改原有的代码。
使用场景
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(对象创建)的更多相关文章
- Java设计模式-工厂方法模式(Virtual Constructor/Polymorphic Factory)
工厂方法模式(Virtual Constructor/Polymorphic Factory) 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性工厂 ...
- 4. 星际争霸之php设计模式--工厂方法模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——工厂方法模式
本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...
- 我的Java设计模式-工厂方法模式
女朋友dodo闹脾气,气势汹汹的说"我要吃雪糕".笔者心里啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?! 但是,雪糕买回来了,她竟然说"不想吃雪糕了,突然想吃披萨" ...
- javascript设计模式-工厂方法模式
工厂方法模式笔记 通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例 对于创建多类对象,简单工厂不太实用,这是简单工厂模式的应用局限,当然这正是工厂方法模式的价值之所在 通过工厂方法模 ...
- 设计模式-工厂方法模式(FactoryMethod)
工厂方法模式又称多态工厂模式.工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactor ...
- 深入浅出设计模式——工厂方法模式(Factory Method)
介绍在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式.它解决的仍然是软件设计中与创建对象有关的问题.它可以更好的处理客户的需求变化. 引入我 ...
- 设计模式——工厂方法模式(Factory Method)
原文地址:http://www.cnblogs.com/Bobby0322/p/4179921.html 介绍 在简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计 ...
- JAVA设计模式--工厂方法模式
工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...
随机推荐
- Codeforces Round #311 (Div. 2) C. Arthur and Table Multiset
C. Arthur and Table Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/557/p ...
- Codeforces Round #311 (Div. 2) A. Ilya and Diplomas 水题
A. Ilya and Diplomas Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/557/ ...
- eclipse内存溢出报错:java.lang.OutOfMemoryError:Java heap space
今天执行了一个比較大的程序,处理的数据达到126MB数据,将数据导入数据库中,用eclipse 来訪问时候,总是出现java.lang.OutOfMemoryError:Java heap space ...
- 《TCP/IP具体解释卷2:实现》笔记--IP多播
D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组. 单个网络上的组成员利用IGMP协议在系统之间通信. 多播路由器用多播选录协议. ...
- apt-mirror is already running(已运行)错误解决方案
运行sudo apt-mirror却无法启动服务了.而是给出了一行错误提示信息: apt-mirror is already running, exiting at /us ...
- 解决ntfs格式的移动硬盘mount到Linux下时变成只读文件系统的问题
环境介绍 主机: XP 虚拟机:VirtualBox+Debian6 遇到的问题 我有一块西部数据的移动硬盘,虚拟机中有一些资料需要拷贝到移动硬盘中,然后我将移动硬盘插上后,执行如下设置,将移动硬盘分 ...
- LeetCode32 Longest Valid Parentheses
题目: Given a string containing just the characters '(' and ')', find the length of the longest valid ...
- python 复杂表达式,以及表单的处理
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 } def generate_tr(name, score): if score < 60: return '& ...
- iOS开发 - 一个天真的搜索控制器的独白
文/Azen(简书作者)原文链接:http://www.jianshu.com/p/6d5327111511著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 正文 一.关于横向模块开发 ...
- NSTimer定时器的用法
#import "ViewController.h" @interface ViewController () { NSTimer *countDownTimer; int cou ...