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 Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp
C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...
- C#操作Excel(1)Excel对象模型
Excel对象模型 (.Net Perspective) 本文主要针对在Visual Studio中使用C# 开发关于Excel的应用程序 本文的PDF下载地址:C#操作Excel2007.pdf ...
- WCF和WPF读取xml的路径问题
使用WCF编写服务,涉及到xml的读取,使用了System.AppDomain.CurrentDomain.BaseDirectory来获取路径,获得的是项目的基目录 例如: string path ...
- LINUX CACHE IO THREAD
http://www.penglixun.com/tech/system/linux_cache_discovery.html http://my.oschina.net/HardySimpson/b ...
- gradle的maven plugin使用
在分布式系统开发中,基于gradle的项目,要共享jar一般是借助maven私服.那么gradle的maven插件如何做到上传binary jar,source jar, javadoc jar到私服 ...
- android studio 预览保持,因为是SDK版本过高,可以点击小图标机器人修改SDK版本号。
Exception raised during rendering: com/android/util/PropertiesMap
- QString,QByteArray和QBitArray之间的转换
1:QBitArray2QString :也可以转化为整型, 测试程序: 测试输出结果是否和移位结果相同: [cpp] view plaincopyprint? QBitArray x; int ...
- linux centos各种问题解决汇总
1. Linux终端启动图形化程序界面时报错: No protocol specified问题: 这是因为Xserver默认情况下不允许别的用户的图形程序的图形显示在当前屏幕上. 如果需要别的用户的图 ...
- 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 5.全局防护Bypass之宽字节注入
0x01 背景 首先我们了解下宽字节注入,宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而导致的注入漏洞.具体原 ...
- IOS 应用 退出的一个小方法
AppDelegate * app=(AppDelegate *)[[UIApplication sharedApplication]delegate]; UIWindow *window = app ...