#pragma mark 创建Person基类 这是.h文件
@interface Person : NSObject
/**
记录子类名字
*/
@property (nonatomic,strong)NSString *name;
/**
初始化基类,根据条件初始化出相应的子类
@param condition 条件(这里 1 为Man, 2 为 Woman)
@return 获取具体的子类
*/
- (instancetype)initPersonSubclassWithCondition:(NSInteger)condition;
/**
子类实现对应的方法
@return 要执行的操作
*/
- (NSString *)likeSomeOne;
@end
#pragma mark Person基类 这是.m文件
#import "Person.h"
#import "Man.h"
#import "Woman.h"
@implementation Person
- (instancetype)initPersonSubclassWithCondition:(NSInteger)condition
{
if (condition == 1) {
Man *man = [[Man alloc]init];
man.name = @"我是男人";
return man;
}
if (condition == 2) {
Woman *woman = [[Woman alloc]init];
woman.name = @"我是女人";
return woman;
}
return nil;
}
- (NSString *)likeSomeOne
{
return nil;
}
@end
#pragma mark 创建Man子类继承Person
#import "Person.h"
@interface Man : Person
@end
#import "Man.h"
@implementation Man
// 重写父类方法
- (NSString *)likeSomeOne
{
return @"我是男人,我喜欢女人";
}
@end
#pragma mark 创建Woman子类继承Person
#import "Person.h"
@interface Woman : Person
@end
#import "Woman.h"
@implementation Woman
// 重写父类方法
- (NSString *)likeSomeOne
{
return @"我是女人,我喜欢男人";
}
@end
#pragma mark 创建Animal基类,根据条件初始化子类
#import <Foundation/Foundation.h>
@interface Animal : NSObject
/**
记录名字
*/
@property (nonatomic,strong)NSString *name;
/**
初始化基类,根据条件初始化出相应的子类
@param condition 条件(这里 1 为Dog, 2 为 Cat)
@return 获取具体的子类
*/
- (instancetype)initAnimalSubclassWithCondition:(NSInteger)condition;
/**
子类实现对应的方法
@return 要执行的操作
*/
- (NSString *)likeEatFood;
@end
#import "Animal.h"
#import "Dog.h"
#import "Cat.h"
@implementation Animal
- (instancetype)initAnimalSubclassWithCondition:(NSInteger)condition
{
if (condition == 1) {
Dog *dog = [[Dog alloc]init];
dog.name = @"我是?";
return dog;
}
if (condition == 2) {
Cat *cat = [[Cat alloc]init];
cat.name = @"我是?";
return cat;
}
return nil;
}
- (NSString *)likeEatFood
{
return nil;
}
@end
#pragma mark 创建Dog子类继承Animal
#import "Animal.h"
@interface Dog : Animal
@end
#import "Dog.h"
@implementation Dog
- (NSString *)likeEatFood
{
return @"我是?,我喜欢吃?";
}
@end
#pragma mark 创建Cat子类继承Animal
#import "Animal.h"
@interface Cat : Animal
@end
#import "Cat.h"
@implementation Cat
- (NSString *)likeEatFood
{
return @"我是?,我喜欢吃?";
}
@end
#pragma mark 创建Factory工厂类
#import <Foundation/Foundation.h>
@class Person;
@class Animal;
@interface Factory : NSObject
/**
工厂Person子类
*/
@property (nonatomic,strong)Person *person;
/**
工厂Animal子类
*/
@property (nonatomic,strong)Animal *animal;
/**
初始化工厂,根据condition 条件初始化 Person/Animal基类,根据subclassCondt初始化基类的子类
@param condition 初始化基类条件(1为 Person, 2 为Animal)
@param subclassCondt 初始化基类子类 (Person类:(1 为Man, 2,为Woman); Animal类:(1 为 Dog, 2 为 Cat))
@return 获取具体的子类
*/
- (instancetype)initFactorySubclassWithCondition:(NSInteger)condition AndBaseSubclassCondition:(NSInteger)subclassCondt;
/**
获取子类名称
*/
- (void)getFactorySubClass;
@end
#pragma mark 将初始化延迟到子类中
#import "Factory.h"
#import "Person.h"
#import "Animal.h"
@implementation Factory
- (instancetype)initFactorySubclassWithCondition:(NSInteger)condition AndBaseSubclassCondition:(NSInteger)subclassCondt
{
if (condition == 1) {
Person *person = [[Person alloc]initPersonSubclassWithCondition:subclassCondt];
self.person = person;
}
if (condition == 2) {
Animal *animal = [[Animal alloc]initAnimalSubclassWithCondition:subclassCondt];
self.animal = animal;
}
return self;
}
- (void)getFactorySubClass
{
if (self.person != nil) {
NSLog(@"%@----%@",self.person.name,[self.person likeSomeOne]);
}
if (self.animal != nil) {
NSLog(@"%@----%@",self.animal.name,[self.animal likeEatFood]);
}
}
@end
#import "Factory.h"
#pragma mark 使用:根据条件创建子类
- (void)viewDidLoad {
[super viewDidLoad];
Factory *man = [[Factory alloc]initFactorySubclassWithCondition:1 AndBaseSubclassCondition:1];
[man getFactorySubClass];
// 打印结果 我是男人----我是男人,我喜欢女人
Factory *woman = [[Factory alloc]initFactorySubclassWithCondition:1 AndBaseSubclassCondition:2];
[woman getFactorySubClass];
// 打印结果 我是男人----我是女人,我喜欢男人
Factory *dog = [[Factory alloc]initFactorySubclassWithCondition:2 AndBaseSubclassCondition:1];
[dog getFactorySubClass];
// 打印结果 我是?----我是?,我喜欢吃?
Factory *cat = [[Factory alloc]initFactorySubclassWithCondition:2 AndBaseSubclassCondition:2];
[cat getFactorySubClass];
// 打印结果 我是?----我是?,我喜欢吃?
}