博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C设计模式——工厂方法模式virtual constructor(对象创建)
阅读量:5326 次
发布时间:2019-06-14

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

工厂方法模式

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

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

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

 

使用场景

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

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

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

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

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

 

创建对象的安全方法

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

 

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

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

 

Demo

内容比较多:

工厂类

#import 
@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 
@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 0;        /*         *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

转载于:https://www.cnblogs.com/madpanda/p/4659975.html

你可能感兴趣的文章
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
字符串比较
查看>>
epoll 技术(转)
查看>>
<转>Shell脚本相关
查看>>
使用FreeMarker加载远程主机上模板文件,比如FTP,Hadoop等(转载)
查看>>
Java的位运算符具体解释实例——与(&amp;)、非(~)、或(|)、异或(^)
查看>>
java 注解 学习
查看>>
[leetcode]403. Frog Jump青蛙过河
查看>>
英语音节知识
查看>>