iOS开发中的设计模式简单工厂模式

1.简单工厂不算是一种设计模式,比较像是一种编程习惯;

2.优点

a.封装变化

b.避免客户直接创建的产品

c.针对接口编程

d.易扩展,新加产品类只需修改工厂类

3.缺点

a.工厂封转了产品创建的逻辑,违反了高内聚责任分配原则

4.使用场景

a.简单的,工厂创建对象比较少

b.客户需要知道创建参数,不必关系创建实现

5.所属基本模式类别

创建型模式

6.简单例子UML图

7.代码

//
//  main.m
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "DuckStore.h"
#import "SimpleDuckFactory.h"
int main(int argc, const char * argv[])
{
    SimpleDuckFactory *factory = [[[SimpleDuckFactory alloc]init]autorelease];
    DuckStore *store = [[[DuckStore alloc]initWithFactory:factory]autorelease];
    [store orderDuck:1];
    [store orderDuck:2];
    return 0;
}


//
//  DuckStore.h
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Duck.h"
#import "SimpleDuckFactory.h"
@interface DuckStore : NSObject
{
    SimpleDuckFactory *_factory;
}
@property (nonatomic, retain)SimpleDuckFactory *factory;

- (void)orderDuck:(int)type;
- (id)initWithFactory:(SimpleDuckFactory *)aFactory;
@end


//
//  DuckStore.m
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import "DuckStore.h"
@implementation DuckStore
@synthesize factory = _factory;

- (void)dealloc
{
    [_factory release];
    [super dealloc];
}

- (void)orderDuck:(int)type
{
    Duck *tmpDuck = nil;
    tmpDuck = [self.factory createDuckWithType:type];
    if (tmpDuck) {
        [tmpDuck behavior];
    }
}

- (id)initWithFactory:(SimpleDuckFactory *)aFactory
{
    if (self = [super init]) {
        self.factory = aFactory;
    }
    return self;
}
@end


//
//  SimpleDuckFactory.h
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Duck.h"
@interface SimpleDuckFactory : NSObject
- (Duck *)createDuckWithType:(int)type;
@end


//
//  SimpleDuckFactory.m
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import "SimpleDuckFactory.h"
#import "RedDuck.h"
#import "BlueDuck.h"
@implementation SimpleDuckFactory

- (Duck *)createDuckWithType:(int)type
{
    Duck *duck = nil;
    switch (type) {
        case 1:
            duck = [[[RedDuck alloc]init]autorelease];
            break;
        case 2:
            duck = [[[BlueDuck alloc]init]autorelease];
            break;
            
        default:
            break;
    }
    return duck;
}
@end


//
//  Duck.h
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import <Foundation/Foundation.h>
//abstract class 
@interface Duck : NSObject
{
    NSString *_name;
}
@property (nonatomic, retain) NSString *name;
- (void)behavior;
@end


//
//  Duck.m
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import "Duck.h"

@implementation Duck
@synthesize name = _name;
- (void)dealloc
{
    [_name release];
    [super dealloc];
}

//abstract method subclass must implentment it
- (void)behavior
{
    [self doesNotRecognizeSelector:_cmd];
}

@end


//
//  BlueDuck.h
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import "Duck.h"
@interface BlueDuck : Duck
@end


//
//  BlueDuck.m
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import "BlueDuck.h"

@implementation BlueDuck

- (id)init
{
    if (self = [super init]) {
        self.name = @"Blue";
    }
    return self;
}

- (void)behavior
{
    NSLog(@"I am blue and name is %@",self.name);
}

@end


//
//  RedDuck.h
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import "Duck.h"

@interface RedDuck : Duck

@end


//
//  RedDuck.m
//  SimpleFactory
//
//  Created by Robin on 3/12/13.
//  Copyright (c) 2013 Robin. All rights reserved.
//

#import "RedDuck.h"

@implementation RedDuck

- (id)init
{
    if (self = [super init]) {
        self.name = @"Red";
    }
    return self;
}

- (void)behavior
{
    NSLog(@"I am red and name is %@",self.name);
}

@end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值