美文网首页
构造方法与类工厂方法

构造方法与类工厂方法

作者: SimpleSJ | 来源:发表于2018-11-06 10:38 被阅读0次
  • 自定义构造方法书写规范:
    • 一定是对象方法,以减号开头
    • 返回值一般是instancetype类型
    • 方法名必须以initWith开头
  • 继承中的自定义构造方法注意点
    • 自己的事情自己做,父类的属性交给父类的方法来处理,子类的方法处理子类自己独有的属性

  • 自定义类工厂方法的书写规范
    • 一定是+号开头
    • 返回值一般是instancetype类型
    • 方法名称以类名开头,首字母小写
  • 继承中的自定义类工厂方法注意点
    • 父类中创建实例对象一定要使用self,不要使用自己的类名,因为self谁调用当前方法self就是谁

// 父类 Person , 子类 Student ,分别提供了自己对应的自定义构造方法与类工厂方法,通过不同的方式分别创建对象

//父类
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (assign,nonatomic)int age;

-(instancetype)initWithAge:(int)age;

+(instancetype)personWithAge:(int)age;
@end


#import "Person.h"
@implementation Person
-(instancetype)initWithAge:(int)age{
    if (self = [super init]) {//固定格式
        _age = age;
    }
    return self;
}

+(instancetype)personWithAge:(int)age{
    //两种方式都可以
    /*
     这里一定要使用self、不要使用person 不然子类如果通过这种方式创建子类的实例对象,会得到person的实例对象, 子类指针指向父类的对象,很危险.
    Person *p = [[self alloc]init];
    p.age = age;
    return p;
     */
    //一定要使用self,不要使用person,如果子类通过这个方法创建实例对象,才能得到子类的实例对象的地址
    return [[self alloc]initWithAge:age];
}
-(NSString *)description{
    return [NSString stringWithFormat:@"age = %i",_age];
}
@end

//子类

#import "Person.h"

@interface Student : Person
@property (assign,nonatomic)int no;//学号

-(instancetype)initWithAge:(int)age andNo:(int)no;

+(instancetype)studentWithAge:(int)age andNo:(int)no;
@end


#import "Student.h"
@implementation Student
-(instancetype)initWithAge:(int)age andNo:(int)no{
    //谁的事情谁来做,直接调用supper,age属于Person
    //谁调用,就得到谁的实例对象地址
    if (self = [super initWithAge:age]) {
        _no = no;
    }
    return self;
}

+(instancetype)studentWithAge:(int)age andNo:(int)no{
    /*
     Student *s = [Student PersonWithAge:age];
     s.no = no;
     return s;
     */
    
    return [[self alloc]initWithAge:age andNo:no];
}
-(NSString *)description{
    return [NSString stringWithFormat:@"age = %i,no = %i",self.age,_no];
}
@end

//创建对象

    //通过自定义构造方法创建Person的实例对象p1
    Person *p1 = [[Person alloc]initWithAge:10];
    NSLog(@"%@",p1);
    //通过自定义类工厂方法创建Person的实例对象p1
    Person *p2 = [Person personWithAge:20];
    NSLog(@"%@",p2);
    //通过自定义构造方法创建Student的实例对象s1
    Student *s1 = [[Student alloc]initWithAge:10 andNo:123];
    NSLog(@"%@",s1);
    //通过自定义类工厂方法创建Student的实例对象s2
    Student *s2 = [Student studentWithAge:20 andNo:456];
    NSLog(@"%@",s2);
    
    //通过父类的构造方法创建Student的实例对象s3
    Student *s3 = [[Student alloc]initWithAge:30];
    s3.no = 789;
    NSLog(@"%@",s3);
    
    //通过父类的类工厂方法创建Student的实例对象s4
    Student *s4 = [Student personWithAge:40];
    s4.no = 999;
    NSLog(@"%@",s4);

//输出:
2018-11-06 10:17:28.104638+0800 构造方法与类工厂方法[1481:68391] age = 10
2018-11-06 10:17:28.104895+0800 构造方法与类工厂方法[1481:68391] age = 20
2018-11-06 10:17:28.104959+0800 构造方法与类工厂方法[1481:68391] age = 10,no = 123
2018-11-06 10:17:28.105007+0800 构造方法与类工厂方法[1481:68391] age = 20,no = 456
2018-11-06 10:17:28.105036+0800 构造方法与类工厂方法[1481:68391] age = 30,no = 789
2018-11-06 10:17:28.105069+0800 构造方法与类工厂方法[1481:68391] age = 40,no = 999

相关文章

  • 构造方法与类工厂方法

    自定义构造方法书写规范:一定是对象方法,以减号开头返回值一般是instancetype类型方法名必须以initWi...

  • 第一条 考虑用静态工厂方法代替构造器

    创建和销毁对象 考虑用静态工厂方法代替构造器 一般使用构造器 使用静态方法 这样写的优势 静态方法有名字构造器与类...

  • 《Effective Java》学习笔记上

    第2章 创建和销毁对象 第1条:考虑用静态工厂方法代替构造方法 静态工厂方法与构造方法的不同 优点: 静态工厂方法...

  • EffectiveJava第2章-创建和销毁对象

    第1条:考虑使用静态工厂方法代替构造器 获取类实例的两种方法:公有的构造器、公有的静态工厂方法返回类的实例。 静态...

  • Java创建和销毁对象

    考虑用静态工厂方法代替构造器 静态工厂方法可以通过静态获取类的一个实例,而不需要通过构造器; 使用静态工厂方法的优...

  • 一、标准构造方法 Dart中所有的类都继承于Object 二、命名构造方法 三、工厂构造方法 // 他不仅是一种构...

  • effective java读书笔记

    一、考虑用静态工厂方法代替构造器1.静态工厂方法有名称,而构造器只能是类名 private Map > map =...

  • 创建和销毁对象

    1,考虑用静态工厂方法代替构造器 切忌第一反应就是提供共有构造器,而不先考虑静态工厂。 类可以通过静态工厂方法返回...

  • Effective java笔记(一),创建与销毁对象

    1、考虑用静态工厂方法代替构造器 类的一个实例,通常使用类的公有的构造方法获取。也可以为类提供一个公有的静态工厂方...

  • Effective Java刷书笔记---静态工厂方法

    Effective Java刷书笔记---静态工厂方法 类实例获取--“考虑”用静态工厂方法代替构造器对于一个类而...

网友评论

      本文标题:构造方法与类工厂方法

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