美文网首页iOS Developer
类工厂方法 == 加属性的初始化方法

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

作者: JACK_岩 | 来源:发表于2017-05-15 17:47 被阅读42次

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

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

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

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

    相关文章

      网友评论

        本文标题:类工厂方法 == 加属性的初始化方法

        本文链接:https://www.haomeiwen.com/subject/uvdstxtx.html