iOS 模拟JAVA 抽象类 抽象工厂方法

JAVA接口 和iOS 的协议 大差不差。

先定义一个协议

@protocol Quackable <NSObject>

@required

-(void)quack;

@end

然后我们定义一个抽象类!

#import "Quackable.h"


@interface AbstractDuckFactory : NSObject<Quackable>

//抽象类方法

-(id<Quackable>)createMallardDuck;

-(id<Quackable>)createRubberDuck;

@end

#import "AbstractDuckFactory.h"

#define AbMethodNotImplemented() \

@throw [NSException exceptionWithName:NSInternalInconsistencyException \

                               reason:[NSString stringWithFormat:@"please You must override %@ in a subclass.", NSStringFromSelector(_cmd)] \

                             userInfo:nil]

@implementation AbstractDuckFactory

- (instancetype)init

{

    NSAssert(![self isMemberOfClass:[self class]], @"AbstractDuckFactory is an abstract class, you should not instantiate it directly.");

    

    return [super init];

}


-(void)quack{

    AbMethodNotImplemented();

}


-(id<Quackable>)createRubberDuck{

    AbMethodNotImplemented();

    return nil;

}


-(id<Quackable>)createMallardDuck{

    AbMethodNotImplemented();

    return nil;

}

用这个抽象类的时候我们可以通过继承的方式!

#import "AbstractDuckFactory.h"


@interface DuckFactory : AbstractDuckFactory


@end

#import "DuckFactory.h"

#import "MallardDuck.h"

#import "RubberDuck.h"

@implementation DuckFactory

-(id<Quackable>)createMallardDuck{

    return [[MallardDuck alloc] init];

}


-(id<Quackable>)createRubberDuck{

    return [[RubberDuck alloc] init];

}

@end

然后是我们的MallardDuck类:

#import <Foundation/Foundation.h>

#import "Quackable.h"

@interface MallardDuck : NSObject<Quackable>


@end

#import "MallardDuck.h"


@implementation MallardDuck


-(void)quack{

    NSLog(@"qucak");

}

@end

我们这里通过抽象工厂来创建MallardDuck类 并执行quack方法。

这里初始化一个鸭子模拟器类,模拟器类通过抽象工厂方法来创建出鸭子 并且让它呱呱的叫。

#import <Foundation/Foundation.h>

#import "Quackable.h"

#import "GooseAdapter.h"

#import "AbstractDuckFactory.h"

@class MallardDuck;

@class RubberDuck;

@interface DuckSimulator : NSObject

@property(nonatomic,strong) id<Quackable> MallardDuck;

@property(nonatomic,strong) id<Quackable> RubberDuck;

@property(nonatomic,strong) id<Quackable> GooseAdapter;

-(void)simulate:(AbstractDuckFactory*)abstractDuckFactory;

@end

这是鸭子模拟器类。

#import "DuckSimulator.h"

#import "RubberDuck.h"

#import "MallardDuck.h"

#import "Goose.h"

#import "QuackCounter.h"

@implementation DuckSimulator

-(instancetype)init{

    self = [super init];

    if (self) {

    }

    return self;

}


-(void)simulate:(AbstractDuckFactory *)abstractDuckFactory{


    _MallardDuck =  [abstractDuckFactory createMallardDuck];

    _RubberDuck  =  [abstractDuckFactory createRubberDuck];

    [self simulateObj:_MallardDuck];

    [self simulateObj:_RubberDuck];

}


-(void)simulateObj:(id<Quackable>)Obj{

    [Obj quack];

}

@end

大体流程是:我们有N个鸭子(例如MallardDuck类),鸭子的种类很多(例如真鸭子,玩具鸭子等),我们通过协议(Quackable)定义了鸭子的行为,好比叫(quack方法),好比飞或者游泳什么的,然后鸭子类实现这个协议,在具体鸭子类里实现具体的方法。

鸭子实例对象创建?

我们创建一个抽象工厂类(AbstractDuckFactory),抽象工厂类里有N个不同鸭子各种对应 的N个创建方法(

-(id<Quackable>)createMallardDuck

),然后我们实现这个抽象工厂(DuckFactory 为 AbstractDuckFactory的子类),继承。然后实现具体鸭子的实例对象。

-(id<Quackable>)createMallardDuck{

    return [[MallardDuck alloc] init];

}


我们创建一个鸭子模拟器(DuckSimulator),模拟器有一个方法接受抽象工厂实例(就是继承自抽象工厂的类)

-(void)simulate:(AbstractDuckFactory*)abstractDuckFactory;


然后在这个方法里通过工厂创建鸭子,并且执行具体鸭子的具体行为。

再UIViewController 里这么用先初始化模拟器对象。

 DuckSimulator * dsr = [[DuckSimulator alloc] init];

然后创建工厂

 DuckFactory *abdf = [[DuckFactory alloc] init];

用的时候就调用模拟器的

-(void)simulate:(AbstractDuckFactory *)abstractDuckFactory

[dsr simulate:abdf];

NSLog 如下:

2018-01-11 23:35:32.931227+0800 HeadFirst[64643:6443090] qucak

2018-01-11 23:35:32.931474+0800 HeadFirst[64643:6443090] Squeak


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值