工厂模式——iSO设计模式介绍

工厂模式即实例化对象,用工厂方法代替 new 操作,又被称作虚构造器。它的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。
工厂方法的类结构图:
工厂方法的类结构图.png 
一般当你在一个类不知道它所必须创建的对象的类时或者一个类希望有它的子类决定所创建的对象时,都可以使用工厂方法。

下面我们就来分享下在iOS中工厂方法的一种实现方法。
如下有一个类图,该图描述了下面即将实现的工厂方法(利用工厂方法,创建出不同的形状)。其中BVShapeFactory为工厂方法的基类,BVShape为形状的基类,BVClient通过BVShapeFactory,利用 BVShapeFactory的子类(BVCircleShapeFactoryBVSquareShapeFactory)分别创建出BVCircleShapeBVSquareShape
一个类图.png


如下图,是在 Xcode 中创建的相关文件
Xcode中创建的相关文件.png


(具体实现步骤如下(建议下载本文最后给出的代码实例,用 Xcode 查阅代码):


1. 创建一个形状基类 BVShape 该类中定义了形状的基本行为和属性,如下代码所示:

BVShape.h
1.//
2.//  BVShape.h
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#define BV_Exception_Format @" %@ 的子类中必须 override:%@ 方法 "
10.
11.@interface BVShape : NSObject
12.
13.@property (nonatomic, weak)NSString *name;
14.
15.//  子类必须重写这个 draw 方法,否则会抛出异常错误
16.-(void)draw;
17.
18.@end

BVShape.m
1.//
2.//  BVShape.m
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVShape.h"
10.
11.@implementation BVShape
12.
13.-(id)init
14.{
15.  self = [super init];
16.    if (self) {
17.        //  做一些初始化任务
18.    }
19.    return self;
20.}
21.
22.-(void)draw
23.{
24.    //  如果是通过 BVShape 的实例调用此处的 draw ,则绘制一个 BVShape 图形
25.    if ([self isMemberOfClass:[BVShape class]]) {
26.       NSLog(@" 绘制一个 BVShape 图形 ");
27.    } else {
28.        //  如果是通过 BVShape 子类的实例调用了此处的 draw ,则抛出一个异常:表明子类并没有重写 draw 方法。
29.        //  注:在 OC 中并没有 abstract class 的概念,只有 protocol ,如果在基类中只定义接口 ( 没有具体方法的实现 )
30.        //     则可以使用 protocol ,这样会更方便。
31.        [NSException raise:NSInternalInconsistencyException
32.                    format:BV_Exception_Format, [NSString stringWithUTF8String bject_getClassName(self)], NSStringFromSelector(_cmd)];
33.    }
34.}
35.
36.@end



在上面的代码中定义了一个 draw 方法,为了让子类必须实现该方法,在 BVShape 中做了特殊处理,具体内容可以看上面的代码,已经有注视了。


2. 子类化形状基类。首先子类化一个圆形类: BVCircleShape
BVCircleShape.h
1.//
2.//  BVCircleShape.h
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVShape.h"
10.
11.@interface BVCircleShape : BVShape
12.
13.@end

BVCircleShape.m
1.//
2.//  BVCircleShape.m
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVCircleShape.h"
10.
11.@implementation BVCircleShape
12.
13.-(void)draw
14.{
15.    NSLog(@" 绘制一个 BVCircleShape 图形 ");
16.}
17.
18.@end


在上面的子类中,重写了基类的 draw 方法。同样,我们再子类化一个正方形类,并重写 draw 方法,如下代码所示:
BVSquareShape.h
1.//
2.//  BVSquareShape.h
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVShape.h"
10.
11.@interface BVSquareShape : BVShape
12.
13.@end

BVSquareShape.m
1.//
2.//  BVSquareShape.m
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVSquareShape.h"
10.
11.@implementation BVSquareShape
12.
13.-(void)draw
14.{
15.    NSLog(@" 绘制一个 BVSquareShape 图形 ");
16.}
17.
18.@end

3. 创建一个工厂方法的基类 BVShapeFactory
BVShapeFactory.h
1.//
2.//  BVShapeFactory.h
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVShape.h"
10.
11.@interface BVShapeFactory : NSObject
12.
13.-(BVShape *) factoryMethod;
14.
15.@end

BVShapeFactory.m
1.//
2.//  BVShapeFactory.m
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVShapeFactory.h"
10.
11.@implementation BVShapeFactory
12.
13.-(BVShape *)factoryMethod
14.{
15.    //  在此处,子类必须重写 factoryMethod 方法。当然,在工厂模式中,也可以在此处返回一个默认的 Product
16.    //  如果是通过 BVShapeFactory 子类的实例调用了此处的 factoryMethod ,则抛出一个异常:表明子类并没有重写 factoryMethod 方法。
17.    [NSException raise:NSInternalInconsistencyException
18.                format:BV_Exception_Format, [NSString stringWithUTF8String bject_getClassName(self)], NSStringFromSelector(_cmd)];
19.
20.    //  下面这个 return 语句只是为了消除警告,实际上永远都不会执行到这里。
21.    return nil;
22.}
23.
24.@end

在上面的代码中,定义了一个 factoryMethod ,该类的子类必须实现该方法,通过实现该方法,返回一个具体的形状对象。下面来看看该类的子类化。

4. 子类化工厂方法的基类。首先子类化一个圆形工厂方法 BVCircleShapeFactory
BVCircleShapeFactory.h
1.//
2.//  BVCircleShapeFactory.h
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVShapeFactory.h"
10.#import "BVCircleShape.h"
11.
12.@interface BVCircleShapeFactory : BVShapeFactory
13.
14.@end

BVCircleShapeFactory.m
1.//
2.//  BVCircleShapeFactory.m
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVCircleShapeFactory.h"
10.
11.@implementation BVCircleShapeFactory
12.
13.-(BVShape *)factoryMethod
14.{
15.    return [[BVCircleShape alloc] init];
16.}
17.
18.@end

如上代码所示,重写了 factoryMethod ,返回一个 BVCircleShape 实例。下面来看看另外一个子类 BVSquareShapeFactory
BVSquareShapeFactory.h
1.//
2.//  BVSquareShapeFactory.h
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVShapeFactory.h"
10.#import "BVSquareShape.h"
11.
12.@interface BVSquareShapeFactory : BVShapeFactory
13.
14.@end

BVSquareShapeFactory.m
1.//
2.//  BVSquareShapeFactory.m
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVSquareShapeFactory.h"
10.
11.@implementation BVSquareShapeFactory
12.
13.-(BVShape *)factoryMethod
14.{
15.    return [[BVSquareShape alloc] init];
16.}
17.
18.@end

该子类返回的是一个 BVSquareShape 实例。

5. 工厂方法的使用。定义一个 BVClient 类,在该类中演示工厂方法的使用。代码如下:
BVClient.h
1.//
2.//  BVClient.h
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.@interface BVClient : NSObject
10.
11.-(void)doSomething;
12.
13.@end

BVClient.m
1.//
2.//  BVClient.m
3.//  FactoryMethodPattern
4.//
5.//  Created by BeyondVincent on 13-5-15.
6.//  Copyright (c) 2013 年  BeyondVincent. All rights reserved.
7.//
8.
9.#import "BVClient.h"
10.
11.#import "BVShapeFactory.h"
12.#import "BVCircleShapeFactory.h"
13.#import "BVSquareShapeFactory.h"
14.
15.#import "BVShape.h"
16.#import "BVCircleShape.h"
17.#import "BVSquareShape.h"
18.
19.@implementation BVClient
20.
21.-(void)doSomething
22.{
23.    //  工厂方法的实例化
24.    BVShapeFactory *circleShapefactory = [[BVCircleShapeFactory alloc] init];
25.    BVShapeFactory *squareShapefactory = [[BVSquareShapeFactory alloc] init];
26.
27.    //  通过工厂方法实例化对应的形状
28.    BVShape *circleShape = [circleShapefactory factoryMethod];
29.    BVShape *squareShape = [squareShapefactory factoryMethod];
30.
31.    //  调用形状的方法
32.    [circleShape draw];
33.    [squareShape draw];
34.}
35.
36.@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值