/* 什么是类工厂方法: 用于快速创建对象的类方法, 我们称之为类工厂方法 类工厂方法中主要用于 给对象分配存储空间和初始化这块存储空间 规范:
1.一定是类方法 +
2.方法名称以类的名称开头, 首字母小写
3.一定有返回值, 返回值是id/instancetype
*/
Person * p = [Person personWithAge:15];
NSLog(@"%@",p);
Student *stu = [Student studentWithAge:15 andNo:20];
NSLog(@"%@",stu);
return 0;
}
#import
@interface Person : NSObject
@property int age;
+(instancetype)personWithAge:(int)age;
- (instancetype)initWithAge:(int)age;
@end
#import "Person.h"
@implementation Person
// return [[Person alloc] init];
// 注意: 以后但凡自定义类工厂方法, 在类工厂方法中创建对象一定不要使用类名来创建
// 一定要使用self来创建
// self在类方法中就代表类对象, 到底代表哪一个类对象呢?
// 谁调用当前方法, self就代表谁
//自定义构造方法
- (instancetype)initWithAge:(int)age
{
if (self = [super init])
{
_age = age;
}
return self;
}
//配套的类工厂方法
+(instancetype)personWithAge:(int)age{
// Person *p = [[Person alloc] init];
// Person *p = [[self alloc] init];
// p.age = age;
// return p;
//用一个匿名对象调用本类的自定义构造方法
return [[self alloc]initWithAge:age];}
//重写description方法,改变描述
- (NSString *)description{
return [NSString stringWithFormat:@"年龄=%i",_age];}
@end
#import
#import "Person.h"
@interface Student : Person
@property int no;
+ (instancetype)studentWithAge:(int)age andNo:(int)no;
- (instancetype)initWithAge:(int)age andNo:(int)no;
@end
#import "Student.h"
@implementation Student
+ (instancetype)studentWithAge:(int)age andNo:(int)no
{
return [[self alloc]initWithAge:age andNo:no];
}
//自定义构造方法
- (instancetype)initWithAge:(int)age andNo:(int)no
{
if (self = [super initWithAge:age]) {
_no = no;
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"年龄=%i学号=%i",[self age],_no];
}
@end
类工厂的主要理念在于产生并返回一个特定类的实例对象,并在产生对象时尽可能的预填充数据。相比调用 alloc/init 再设置特性,使用类工厂的一个显而易见的好处就是,你的代码将会缩短很多。
这样,你就能使用一个方法来创建一个对象并初始化它的所有特性,而不需要用一个方法来创建对象,再用很多行代码来设置各种特性。与此同时,这种技术还有个不太明显的好处。
它强制了每个使用你的类的人必须提供你所需要的每一项数据,以创建一个功能完整的实例对象。鉴于你在本教程的前面部分所创建的那些对象,你可能也发现了,往往很容易就忘记了一个或两个特性的初始化。有了类工厂方法, 你将被强制关注你创建对象所需要的每一项特性。