iOS应用设计模式开发中对简单工厂和工厂方法模式的运用

 更新时间:2016年03月25日 09:26:10   投稿:goldensun  
这篇文章主要介绍了iOS应用设计模式开发中对简单工厂和工厂方法模式的运用,示例代码为传统的Objective-C,需要的朋友可以参考下

简单工厂模式
正如此模式的名称一样,简单工厂模式基本上是所有设计模式里最简单的一种,类与类之间的关系一目了然。这次我就用很多地方经常举的例子--计算器,来说明这个模式。首先给大家展示一下类之间的结构图:

201632592553288.jpg (500×241)

通过这张结构图,可以清晰的看到,加法类、减法类、乘法类、除法类继承自运算类,简单工厂类依赖于运算类的实例化来实现相应的运算功能,好的,看起来并不复杂,让我们直接展示一下代码吧(鉴于目前点点不支持Objective C的代码高亮,所以就直接写啦,尽量保持整齐吧。另,为了照顾像我一样基础不是很好的同学,我尽量把代码写全,方便大家调试)。

注意:本文所有代码均在ARC环境下编译通过。

首先是运算类(父类):
接口文件:

复制代码 代码如下:

#import <Foundation/Foundation.h>

@interface Operation :NSObject{
    double numberA;
    double numberB;
}
@property double numberA;
@property double numberB;
-(double) GetResult;
@end


实现文件:
复制代码 代码如下:

#import"Operation.h"

@implementation Operation
@synthesize numberA, numberB;

-(double) GetResult{
    return    -1.0;      //此处默认返回-1.0,无其他意义
}

@end


加法类(运算子类):
接口文件:
复制代码 代码如下:

#import "Operation.h"

@interface OperationAdd:Operation
@end


实现文件:
复制代码 代码如下:

#import "OperationAdd.h"

@implementation OperationAdd

-(double) GetResult{
    double result =0;
    result =numberA+numberB;
    return result;
}

@end


减法类(运算子类):
接口文件:
复制代码 代码如下:

#import "Operation.h"
@interface OperationSub:Operation
@end

实现文件:
复制代码 代码如下:

#import "OperationSub.h"

@implementation OperationSub

-(double)GetResult{
    double result =0;
    result = numberA-numberB;
    return result;
}

@end


乘法类(运算子类)
复制代码 代码如下:

#import "Operation.h"
@interface OperationMul:Operation
@end

实现文件:
复制代码 代码如下:

#import "OperationMul.h"

@implementation OperationMul

-(double)GetResult{
    double result =0;
    result = numberA*numberB;
    return result;
}

@end


除法类(运算子类):
接口文件:
复制代码 代码如下:

#import "Operation.h"

@interface OperationDiv:Operation
@end


实现文件:
复制代码 代码如下:

#import "OperationDiv.h"

@implementation OperationDiv

-(double)GetResult{
    double result =0;
    @try{
        result = numberA/numberB;
    }
    @catch(NSException *exception) {
        NSLog(@"除数不能为0");
    }
    return result;
}

@end


下面是工厂类(依赖实力化运算类实现具体功能):
接口文件:
复制代码 代码如下:

#import <Foundation/Foundation.h>
#import "OperationAdd.h"
#import "OperationDiv.h"
#import "OperationSub.h"
#import "OperationMul.h"

@interface OperationFactory:NSObject
+(Operation*)CreateOperate:(char)operate;
@end


实现文件:
复制代码 代码如下:

#import "OperationFactory.h"

+(Operation*)CreateOperate:(char)operate{
    Operation *oper;
    switch(operate) {
        case '+':
            oper = [[OperationAdd alloc]init];
            break;
        case '-':
            oper = [[OperationSub alloc]init];
            break;
        case '*':
            oper = [[OperationMul alloc]init];
            break;
        case '/':
            oper = [[OperationDiv alloc]init];
            break;
        default:
            oper = nil;
            break;
        }
        return oper;
}


具体调用
复制代码 代码如下:

#import <Foundation/Foundation.h>
#import "OperationAdd.h"
#import "OperationDiv.h"
#import "OperationMul.h"
#import "OperationSub.h"
#import "OperationFactory.h"

int main (int argc,const char* argv[])
{
    @autoreleasepool{
        Operation *oper = [OperationFactory CreateOperate:'*'];
        [oper setNumberA:1];
        [oper setNumberB:2];
        double result = 0;
        result = [oper GetResult];
        NSLog(@"Result is %f", result);
    }
    return 0;
}


好啦,上面罗列的是简单工厂模式的基础代码。其实还是挺简单的,对吧,只有一层继承关系,一个依赖关系,在工厂类里面用switch语句判别需要实例化哪种类型,之后进行计算,获取结果。

工厂方法模式
上面关于简单工厂模式中就有提到过一次关于“工厂类”模式。为了帮助大家能够回忆一下简单工厂模式,在这里提一下简单工厂模式的优点,简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。其实,工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是,由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

下面还是以计算器为例子,详细介绍工厂方法模式,还是老样子,先向大家展示一下类结构图。

201632592617967.jpg (500×507)

上面这张图向大家展示了各个类之间的关系。其实和简单工厂模式不同的是,类图的右边抽象工厂接口是相比简单工厂模式多出来的抽象接口。

下面直接上代码吧,别的不多说了。

注意:本文所有代码均在ARC环境下编译通过。

Operation类接口

复制代码 代码如下:

#import <Foundation/Foundation.h>

@interface Operation :NSObject{
    double numberA;
    double numberB;
}
@property double numberA;
@property double numberB;
-(double) GetResult;
@end


Operation类实现
复制代码 代码如下:

#import "Operation.h"

@implementation Operation
@synthesize numberA, numberB;
-(double) GetResult{
    return -1.0;
}
@end


OperationAdd类接口
复制代码 代码如下:

#import "Operation.h"

@interface OperationAdd :Operation
@end


OperationAdd类实现
复制代码 代码如下:

#import "OperationAdd.h"

@implementation OperationAdd
-(double) GetResult{
    double result =0;
    result = numberA+numberB;
    return result;
}
@end


OperationDiv类接口
复制代码 代码如下:

#import "Operation.h"

@interface OperationDiv :Operation
@end


OperationDiv类实现
复制代码 代码如下:

#import "OperationDiv.h"

@implementation OperationDiv
-(double)GetResult{
    double result =0;
    @try{
        result = numberA/numberB;
    }
    @catch(NSException *exception) {
        NSLog(@"除数不能为0");
    }
    return result;
}
@end


OperationMul类接口
复制代码 代码如下:

#import "Operation.h"

@interface OperationMul :Operation
@end
OperationMul类实现

#import "OperationMul.h"

@implementation OperationMul
-(double)GetResult{
    double result =0;
    result = numberA*numberB;
    return result;
}
@end


OperationSub类接口
复制代码 代码如下:

#import "Operation.h"

@interface OperationSub :Operation
@end


OperationSub类实现
复制代码 代码如下:

#import "OperationSub.h"

@implementation OperationSub
-(double)GetResult{
    double result =0;
    result = numberA-numberB;
    return result;
}
@end


IFactory类接口
复制代码 代码如下:

#import <Foundation/Foundation.h>

#import "Operation.h"
@interface IFactory :NSObject
-(Operation*)CreateOperation;
@end


IFactory类实现
复制代码 代码如下:

#import "IFactory.h"

@implementation IFactory
-(Operation*)CreateOperation{
    return [[Operation alloc]init];
}
@end


AddFactory类接口
复制代码 代码如下:

#import "IFactory.h"

@interface AddFactory :IFactory
@end


AddFactory类实现
复制代码 代码如下:

#import "AddFactory.h"
#import "OperationAdd.h"

@implementation AddFactory
-(Operation*)CreateOperation{
    return [[OperationAdd alloc]init];
}
@end


SubFactory类接口
复制代码 代码如下:

#import "IFactory.h"

@interface SubFactory :IFactory
@end


SubFactory类实现
复制代码 代码如下:

#import "SubFactory.h"
#import "OperationSub.h"

@implementation SubFactory
-(Operation*)CreateOperation{
    return [[OperationSub alloc]init];
}
@end


MulFactory类接口
复制代码 代码如下:

#import "IFactory.h"

@interface MulFactory :IFactory
@end


MulFactory类实现
复制代码 代码如下:

#import "MulFactory.h"
#import "OperationMul.h"

@implementation MulFactory
-(Operation*)CreateOperation{
    return [[OperationMul alloc]init];
}
@end


DivFactory类接口
复制代码 代码如下:

#import "IFactory.h"

@interfaceDiv Factory :IFactory
@end


DivFactory类实现
复制代码 代码如下:

#import "DivFactory.h"
#import "OperationDiv.h"

@implementation DivFactory
-(Operation*)CreateOperation{
    return [[OperationDiv alloc]init];
}
@end


Main方法调用
复制代码 代码如下:

#import <Foundation/Foundation.h>
#import "OperationAdd.h"
#import "AddFactory.h" //加法工厂,你可以根据需要添加其他运算工厂

int main (int argc,const char* argv[])
{
    @autoreleasepool{
        IFactory *operFactory = [[AddFactory alloc]init];
        Operation *oper = [operFactory CreateOperation];
        [oper setNumberA:1];
        [oper setNumberB:2];
        double result = [oper GetResult];
        NSLog(@"The result is %f", result);
    }
    return 0;
}


好啦,上面就是工厂方法模式的Objective C的类代码。

相关文章

  • iOS的客户端菜单功能仿百度糯米/美团二级菜单

    iOS的客户端菜单功能仿百度糯米/美团二级菜单

    我刚好最近在开发一个商城项目,实现了一个简单的控件,控件的效果就是类似百度糯米或者美团的二级菜单,非常不错具有参考借鉴价值,对百度糯米 美团二级菜单功能感兴趣的朋友一起看看吧
    2016-11-11
  • IOS开发用户登录注册模块所遇到的问题

    IOS开发用户登录注册模块所遇到的问题

    最近和另外一位同事负责公司登录和用户中心模块的开发工作。通过本文给大家分享IOS开发用户登录注册模块所遇到的问题,感兴趣的朋友一起学习吧
    2016-01-01
  • searchDisplayController 引起的数组越界处理办法

    searchDisplayController 引起的数组越界处理办法

    这篇文章主要介绍了searchDisplayController 引起的数组越界处理办法,需要的朋友可以参考下
    2015-07-07
  • iOS中tableView cell分割线的一些设置技巧

    iOS中tableView cell分割线的一些设置技巧

    在项目开发中我们会常常遇到tableView 的cell分割线显示不全,左边会空出一截像素,更有甚者想改变系统的分割线,下面通过这篇文章来一起学习学习在iOS中tableView cell分割线的一些设置技巧,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • 详解iOS游戏开发中Cocos2D的坐标位置关系

    详解iOS游戏开发中Cocos2D的坐标位置关系

    这篇文章主要介绍了iOS游戏开发中Cocos2D的坐标位置关系,Cocos2D是专门用来开发iOS游戏的开源框架,文中示例代码采用Objective-C语言,需要的朋友可以参考下
    2016-02-02
  • 两种iOS调用系统发短信的方法

    两种iOS调用系统发短信的方法

    iOS调用系统的发短信功能可以分为两种:1,程序外调用系统发短信。2,程序内调用系统发短信。第二种的好处是用户发短信之后还可以回到app。这对app来说非常重要。
    2016-07-07
  • iOS中正向、逆向传值的方法总结

    iOS中正向、逆向传值的方法总结

    这篇文章主要给大家总结介绍了关于iOS中正向、逆向传值的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • iOS实现左右可滑动的选择条实例代码分享

    iOS实现左右可滑动的选择条实例代码分享

    本文通过实例代码给大家介绍了ios实现左右可滑动的选择条功能,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-03-03
  • 详解IOS中GCD的使用

    详解IOS中GCD的使用

    GCD是iOS的一种底层多线程机制,本文给大家详细介绍IOS中GCD的使用,需要的朋友参考下吧
    2016-02-02
  • 检测iOS设备是否越狱的方法

    检测iOS设备是否越狱的方法

    这篇文章主要介绍了检测iOS设备是否越狱的方法,代码基于传统的Objective-C,需要的朋友可以参考下
    2015-10-10

最新评论