福州网站设计企业建站,wordpress 主题函数,龙岗区黄阁坑社区,外包公司被辞退有补偿吗一、什么是工厂方法#xff1f; 正式的解释是#xff1a;在基类中定义创建对象的一个接口#xff0c;让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。工厂方法要解决的问题是对象的创建时机#xff0c;它提供了一种扩展的策略#xff0c;很好地符合了… 一、什么是工厂方法 正式的解释是在基类中定义创建对象的一个接口让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。工厂方法要解决的问题是对象的创建时机它提供了一种扩展的策略很好地符合了开放封闭原则。工厂方法也叫做虚构造器Virtual Constructor。 个人的拙见是通过工厂方法创建工厂对象然后在工厂类中定义创建基类的子类对象的方法并通过外部传入的条件判断去创建哪一个子类对象不过由于OC是运行时语言所以工厂类虽然提供了创建子类对象的方法但是在编译时期并不能确定对象类型编译时期创建的子类对象类型是基类类型真正的类型在运行时期由子类来确定也即此时确定为子类类型。 二、工厂方法的实现条件 1存在继承关系 2运用了多态的特性 三、工厂方法的优缺点 优点极大地优化了代码如果需要100个子类对象不用再一直调用alloc方法去创建而是直接通过其工厂类的一句代码即可实现提高了对代码的复用性。同时也可以将大量的操作放到工厂类中去处理业务类中只负责去调用创建需要的对象即可。 缺点因为它的实现条件之一必须存在继承关系所以模式中工厂类集中了所有的创建逻辑形成一个庞大的全能类当所有的类不是继承自同一个父类的时候扩展比较困难。 四、创建一个简单的工厂方法如下 工厂类PersonFactory // PersonFactory.h
//
// Created by 夏远全 on 16/12/23.
// Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved.
//#import Foundation/Foundation.hextern 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.hNSString *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.hinterface Person : NSObject/*** 打印类名*/
-(void)printClassName;end //
// Person.m
//
// Created by 夏远全 on 16/12/23.
// Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved.
//#import Person.himplementation Person-(void)printClassName{}end 子类教师类Teacher(重写基类方法的同时也可以定义属于自己的新的方法) // Teacher.h
//
// Created by 夏远全 on 16/12/23.
// Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved.
//#import Person.hinterface Teacher : Person/*** 教师的行为*/
-(void)teachStudent;
end // Teacher.m
//
// Created by 夏远全 on 16/12/23.
// Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved.
//#import Teacher.himplementation 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.hinterface Student : Person/*** 学生的行为*/
-(void)learnKnowledge;end // Student.m
//
// Created by 夏远全 on 16/12/23.
// Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved.
//#import Student.himplementation 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.hint main(int argc, const char * argv[]) {autoreleasepool {//创建工厂对象PersonFactory *personFactory [[PersonFactory alloc] init];//连续创建Person的子类教师类对象for (int i0; i5; i) {[personFactory createObject:TeacherClassName compelete:^(Person *object) {[object printClassName];}];}//连续创建Person的子类学生类对象for (int i0; i5; i) {[personFactory createObject:StudentClassName compelete:^(Person *object) {[object printClassName];}];}}return 0;
} 打印结果 2016-12-23 21:58:51.235 PersonFactory[8896:442793] Teacher---Teacher: 0x100f01660
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---Teacher: 0x103800100
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---Teacher: 0x100c005c0
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---Teacher: 0x100c00550
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---Teacher: 0x100c00180
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---Student: 0x100a00020
2016-12-23 21:58:51.237 PersonFactory[8896:442793] learnKnowledge
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---Student: 0x100a02880
2016-12-23 21:58:51.237 PersonFactory[8896:442793] learnKnowledge
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---Student: 0x103900000
2016-12-23 21:58:51.237 PersonFactory[8896:442793] learnKnowledge
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---Student: 0x103800220
2016-12-23 21:58:51.238 PersonFactory[8896:442793] learnKnowledge
2016-12-23 21:58:51.238 PersonFactory[8896:442793] Student---Student: 0x103800230
2016-12-23 21:58:51.238 PersonFactory[8896:442793] learnKnowledge
Program ended with exit code: 0 本人原创此处是自己对知识的回炉如果理解有误请大家不吝赐教对我进行斧正。 程序猿神奇的手每时每刻这双手都在改变着世界的交互方式 本文转自当天真遇到现实博客园博客原文链接http://www.cnblogs.com/XYQ-208910/p/6216246.html如需转载请自行联系原作者