欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程语言 > asp.net >内容正文

asp.net

ios设计模式(03):工厂方法 -凯发k8官方网

发布时间:2025/1/21 asp.net 21 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 ios设计模式(03):工厂方法 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘python工程师标准>>>

gof是这样描述工厂模式的:

“define an interface for creating an object, but let subclasses decide which class to instantiate. factory method lets a class defer instantiation to subclasses.”

 

在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。

 

工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好地符合了开放封闭原则。工厂方法也叫做虚构造器(virtual constructor)。

 

如下图所示,是工厂方法的类结构图:

 

什么时候使用工厂方法?

当是如下情况是,可以使用工厂方法:一个类不知道它所必须创建的对象的类时,一个类希望有它的子类决定所创建的对象时。

 

更多关于工厂方法的介绍,可以参考本文最后给出的参考内容。下面我们就来看看在ios中工厂方法的一种实现方法。

 

ios中工厂方法的实现

如下有一个类图,该图描述了下面即将实现的工厂方法(利用工厂方法,创建出不同的形状)。其中bvshapefactory为工厂方法的基类,bvshape为形状的基类,bvclient通过bvshapefactory,利用 bvshapefactory的子类(bvcircleshapefactory和bvsquareshapefactory)分别创建出bvcircleshape和bvsquareshape。

 

如下图,是在xcode中创建的相关文件

 

 

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

 

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

 

bvshape.h

1.//

2.//  bvshape.h

3.//  factorymethodpattern

4.//

5.//  created by beyondvincent on 13-5-15.

6.//  凯发k8官方网 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.//  凯发k8官方网 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:object_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.//  凯发k8官方网 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.//  凯发k8官方网 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.//  凯发k8官方网 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.//  凯发k8官方网 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.//  凯发k8官方网 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.//  凯发k8官方网 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:object_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.//  凯发k8官方网 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.//  凯发k8官方网 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.//  凯发k8官方网 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.//  凯发k8官方网 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.//  凯发k8官方网 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.//  凯发k8官方网 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

 

如上代码所示,首先实例化两个工厂方法,并通过工厂方法创建出对应的形状,最后调用形状的draw方法进行测试。会在控制台窗口输出如下内容:

2013-05-16 10:12:46.292 factorymethodpattern[2845:c07] 绘制一个bvcircleshape图形

2013-05-16 10:12:46.295 factorymethodpattern[2845:c07] 绘制一个bvsquareshape图形


转载于:https://my.oschina.net/u/1432769/blog/375410

总结

以上是凯发k8官方网为你收集整理的ios设计模式(03):工厂方法的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图