类工厂方法 == 加属性的初始化方法

/*    什么是类工厂方法:    用于快速创建对象的类方法, 我们称之为类工厂方法    类工厂方法中主要用于 给对象分配存储空间和初始化这块存储空间    规范:   

 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 再设置特性,使用类工厂的一个显而易见的好处就是,你的代码将会缩短很多。

这样,你就能使用一个方法来创建一个对象并初始化它的所有特性,而不需要用一个方法来创建对象,再用很多行代码来设置各种特性。与此同时,这种技术还有个不太明显的好处。

它强制了每个使用你的类的人必须提供你所需要的每一项数据,以创建一个功能完整的实例对象。鉴于你在本教程的前面部分所创建的那些对象,你可能也发现了,往往很容易就忘记了一个或两个特性的初始化。有了类工厂方法, 你将被强制关注你创建对象所需要的每一项特性。

你可能感兴趣的:(类工厂方法 == 加属性的初始化方法)