服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS应用设计模式开发中对简单工厂和工厂方法模式的运用

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

2021-01-12 16:09iOS开发网 IOS

这篇文章主要介绍了iOS应用设计模式开发中对简单工厂和工厂方法模式的运用,示例代码为传统的Objective-C,需要的朋友可以参考下

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

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

通过这张结构图,可以清晰的看到,加法类、减法类、乘法类、除法类继承自运算类,简单工厂类依赖于运算类的实例化来实现相应的运算功能,好的,看起来并不复杂,让我们直接展示一下代码吧(鉴于目前点点不支持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语句判别需要实例化哪种类型,之后进行计算,获取结果。

 

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

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

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

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

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

注意:本文所有代码均在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的类代码。

 

 

延伸 · 阅读

精彩推荐
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01