一、什么是工厂方法?

正式的解释是:在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好地符合了开放封闭原则。工厂方法也叫做虚构造器(Virtual Constructor)。

个人的拙见是:通过工厂方法创建工厂对象,然后在工厂类中定义创建基类的子类对象的方法并通过外部传入的条件判断去创建哪一个子类对象,不过由于OC是运行时语言,所以工厂类虽然提供了创建子类对象的方法,但是在编译时期并不能确定对象类型,编译时期创建的子类对象类型是基类类型,真正的类型在运行时期由子类来确定,也即此时确定为子类类型。

二、工厂方法的实现条件?

(1)存在继承关系

(2)运用了多态的特性

三、工厂方法的优缺点?

优点:极大地优化了代码,如果需要100个子类对象,不用再一直调用alloc方法去创建,而是直接通过其工厂类的一句代码即可实现,提高了对代码的复用性。同时,也可以将大量的操作放到工厂类中去处理,业务类中只负责去调用创建需要的对象即可。

缺点:因为它的实现条件之一必须存在继承关系,所以模式中工厂类集中了所有的创建逻辑,形成一个庞大的全能类,当所有的类不是继承自同一个父类的时候扩展比较困难。

四、创建一个简单的工厂方法如下

工厂类:PersonFactory

//  PersonFactory.h
//
// Created by 夏远全 on 16/12/23.
// Copyright 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import <Foundation/Foundation.h> extern NSString *TeacherClassName;
extern NSString *StudentClassName; @class Person;
@interface PersonFactory : NSObject /**
* 定义的一个创建子类对象的接口,通过传入的类名称创建对应的子类对象
*
* @param className 类名称
* @param callBlcok 回调,返回创建的子类对象,此时接收子类对象的类型Person类型
*/
-(void)createObject:(NSString *)className compelete:(void (^)(Person *object))callBlcok; @end
//  PersonFactory
//
// Created by 夏远全 on 16/12/23.
// Copyright 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import "PersonFactory.h"
#import "Person.h"
#import "Teacher.h"
#import "Student.h" NSString *TeacherClassName = @"Teacher";
NSString *StudentClassName = @"Student"; @implementation PersonFactory -(void)createObject:(NSString *)className compelete:(void (^)(Person *object))callBlcok{ if ([className isEqualToString:NSStringFromClass([Teacher class])]) { //创建教师类对象
Teacher *teacher = [[Teacher alloc] init]; //回调
callBlcok(teacher); //教书
[teacher teachStudent];
} if ([className isEqualToString:NSStringFromClass([Student class])]) { //创建学生类的对象
Student *student = [[Student alloc] init]; //回调
callBlcok(student); //学习
[student learnKnowledge]; }
} @end

基类:Person(里面提供的方法都被子类重写)

//  Person.h
//
// Created by 夏远全 on 16/12/23.
// Copyright 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import <Foundation/Foundation.h> @interface Person : NSObject /**
* 打印类名
*/
-(void)printClassName; @end
//
// Person.m
//
// Created by 夏远全 on 16/12/23.
// Copyright 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import "Person.h" @implementation Person -(void)printClassName{ } @end

子类教师类:Teacher(重写基类方法的同时,也可以定义属于自己的新的方法)

//  Teacher.h
//
// Created by 夏远全 on 16/12/23.
// Copyright 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import "Person.h" @interface Teacher : Person /**
* 教师的行为
*/
-(void)teachStudent;
@end
//  Teacher.m
//
// Created by 夏远全 on 16/12/23.
// Copyright 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import "Teacher.h" @implementation Teacher -(void)printClassName{ NSLog(@"%@---%@",NSStringFromClass([self class]),self);
} -(void)teachStudent{ NSLog(@"teach student");
} @end

子类学生类:Student(重写基类方法的同时,也可以定义属于自己的新的方法)

//  Student.h
//
// Created by 夏远全 on 16/12/23.
// Copyright 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import "Person.h" @interface Student : Person /**
* 学生的行为
*/
-(void)learnKnowledge; @end
//  Student.m
//
// Created by 夏远全 on 16/12/23.
// Copyright 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import "Student.h" @implementation Student -(void)printClassName{ NSLog(@"%@---%@",NSStringFromClass([self class]),self);
} -(void)learnKnowledge{ NSLog(@"learnKnowledge");
} @end

main.m演示如下:

//  main.m
// PersonFactory
//
// Created by 夏远全 on 16/12/23.
// Copyright 2016年 广州市东德网络科技有限公司. All rights reserved.
// #import <Foundation/Foundation.h>
#import "PersonFactory.h"
#import "Person.h"
#import "Teacher.h"
#import "Student.h" int main(int argc, const char * argv[]) {
@autoreleasepool { //创建工厂对象
PersonFactory *personFactory = [[PersonFactory alloc] init]; //连续创建Person的子类教师类对象
for (int i=0; i<5; i++) {
[personFactory createObject:TeacherClassName compelete:^(Person *object) {
[object printClassName];
}];
} //连续创建Person的子类学生类对象
for (int i=0; i<5; i++) {
[personFactory createObject:StudentClassName compelete:^(Person *object) {
[object printClassName];
}];
}
}
return 0;
}
 

iOS工厂模式使用小结的更多相关文章

  1. 设计模式 — 抽象工厂模式(Abstract Factory)

    工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...

  2. Spring设计模式_工厂模式

    先说下工厂模式的特性 1.对于调用者来说,影藏了复杂的逻辑处理过程,调用者只关心执行结果. 2.工厂要对结果负责,保证生产出符合规范的产品. Git代码地址  https://github.com/w ...

  3. iOS 抽象工厂模式

    iOS 抽象工厂模式 什么是抽象工厂模式 简单了解一下 按照惯例,我们先了解一下什么是抽象工厂模式.抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种 ...

  4. iOS 工厂方法模式

    iOS工厂方法模式 什么是工厂方法模式? 工厂方法模式和简单工厂模式十分类似,大致结构是基本类似的.不同在于工厂方法模式对工厂类进行了进一步的抽象,将之前的一个工厂类抽象成了抽象工厂和工厂子类,抽象工 ...

  5. iOS 简单工厂模式

    iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...

  6. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  7. iOS开发-简单工厂模式

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.概念很长,iOS开发中最常 ...

  8. iOS设计模式 - (3)简单工厂模式

    iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/ ...

  9. iOS中的事件响应链、单例模式、工厂模式、观察者模式

    学习内容 欢迎关注我的iOS学习总结--每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary iOS中事件传递和相应机制 i ...

  10. IOS之Objective-C学习 工厂模式

    工厂模式在父类里声明(可实现)创建对象的一个接口,让子类决定实例化哪个类,也就是说让一个类的实例化延迟到子类中生产. 工厂模式一般用于在不同地方创建对象和项目部署依赖多个数据库的时候. 工厂模式有三种 ...

随机推荐

  1. python面向对象游戏练习:好人坏人手枪手榴弹

    python面向对象游戏练习:好人坏人手枪手榴弹 主要是多态的练习,对象作为参数传给方法使用 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 ...

  2. 9、IDEA集成Github

    9.1.登录Github账号 9.1.1.打开IDEA的Settings界面 如上图所示,打开IDEA的 Settings(设置)界面. 9.1.2.使用账号密码登录(方式一) 如上图所示,在&quo ...

  3. Windows报错0xc0000142的处理方法

    1.问题描述 桌面有个弹窗报错(0xc0000142),无法关闭,影响Windows的使用 此错误很有可能是缺少组件导致 2.解决办法 进入" C:\Windows\System32 &qu ...

  4. 【Spring】09 后续的学习补充 vol3

    原生JDBC事务: package dao; import cn.dzz.util.DruidUtil; import org.apache.commons.dbutils.QueryRunner; ...

  5. AI的发展需要有应用和落地场景 —— 李开复:传统公司看不懂技术,大模型落地B端阻碍多

    引自:https://baijiahao.baidu.com/s?id=1801826206644007472&wfr=spider&for=pc "我们投了七八家机器人企业 ...

  6. oracle利用job实现存储过程异步执行

    1.背景 在实际开发中,我们可能会利用存储过程批量处理业务, 对应有些存储过程可能会执行很长时间,这时我们需要客户端点操作后,存储过程异步执行 具体实现如下 1.创建处理业务的存储过程:sp_test ...

  7. jQuery Eazyui的学习和使用(二)

    既然这么优秀,我们赶紧来学学吧~ 下载地址 解压得到这些文件夹: 下面开始学习使用.(根据提供的demo学习常用基础控件的使用) 基础面板 引入对应样式文件和js文件后就可以直接使用了. 代码: &l ...

  8. 《最新出炉》系列小成篇-Python+Playwright自动化测试-66 - 等待元素至指定状态(出现、移除、显示和隐藏)

    1.简介 在我们日常工作中进行UI自动化测试时,保证测试的稳定性至关重要.其中一个关键方面是正确地定位和操作网页中的元素.在网页中,元素可能处于不同的状态,有些可能在页面加载完成之前不在DOM中,需要 ...

  9. springcloud线上发布超时之feign(ribbon饥饿加载)

    springcloud线上发布超时系列文章: springcloud线上发布超时之feign(ribbon饥饿加载) springcloud线上发布超时之grpc springcloud线上发布超时方 ...

  10. 【CMake系列】03-cmake 注释、常用指令 message、set、file、for_each、流程控制if

    本文给出了 cmake 中的 一些常用的 指令,可以快速了解,为后面的内容深入 打点基础. 本专栏的详细实践代码全部放在 github 上,欢迎 star !!! 如有问题,欢迎留言.或加群[3927 ...