zoukankan      html  css  js  c++  java
  • [ios设计模式]简单工厂模式【转】

    前言

    自上一篇文章有两个礼拜的时间了,本来想余下一段时间内尽量用英文写文章,包括技术文。前两天点点网的统计数据里添加了对每个博客里文章访问量的一个排 名,发现我的博客里访问最多的竟然是Objective C!说实话,有些意外,后细想来也许有很多和我一样的初学者朋友想学习这门语言,犹豫再三,本着分享知识的原则,还是用中文写吧,其他类型的文章再当练习 英语,用英文来写。好啦,废话就到这里吧,接下来进入正题。

    今天开始,我们来探讨一下用Objective C来简单实现的常见的设计模式。这次想和大家分享的是:简单工厂模式。

    严格说来,简单工厂模式不属于GoF的23种设计模式之列,但是作为简单的入门知识,我还是想从简单工厂模式开始说起。

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


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

    • 首先是运算类(父类):

    • 接口文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #import <Foundation/Foundation.h>
                            
    @interfaceOperation :NSObject{
       doublenumberA;
       doublenumberB;
    }
    @propertydouble numberA;
    @propertydouble numberB;
    -(double) GetResult;
    @end
    • 实现文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #import"Operation.h"
                          
    @implementationOperation
    @synthesizenumberA, numberB;
                          
    -(double) GetResult{
    return   -1.0;      //此处默认返回-1.0,无其他意义
    }
                          
    @end
    • 加法类(运算子类):

    • 接口文件:

    1
    2
    3
    4
    #import "Operation.h"
                        
    @interfaceOperationAdd:Operation
    @end
    • 实现文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #import "OperationAdd.h"
                       
    @implementationOperationAdd
                       
    -(double) GetResult{
       doubleresult =0;
       result =numberA+numberB;
       returnresult;
    }
                       
    @end
    • 减法类(运算子类):

    • 接口文件:

    1
    2
    3
    #import "Operation.h"
    @interfaceOperationSub:Operation
    @end
    • 实现文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #import "OperationSub.h"
                   
    @implementationOperationSub
                   
    -(double)GetResult{
       doubleresult =0;
       result = numberA-numberB;
       returnresult;
    }
                   
    @end
    • 乘法类(运算子类):

    • 接口文件:

    1
    2
    3
    #import "Operation.h"
    @interfaceOperationMul:Operation
    @end
    • 实现文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #import "OperationMul.h"
                
    @implementationOperationMul
                
    -(double)GetResult{
       doubleresult =0;
       result = numberA*numberB;
       returnresult;
    }
                
    @end
    • 除法类(运算子类):

    • 接口文件:

    1
    2
    3
    4
    #import "Operation.h"
              
    @interfaceOperationDiv:Operation
    @end
    • 实现文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #import "OperationDiv.h"
             
    @implementationOperationDiv
             
    -(double)GetResult{
       doubleresult =0;
    @try{
       result = numberA/numberB;
    }
    @catch(NSException*exception) {
       NSLog(@"除数不能为0");
    }
      returnresult;
    }
             
    @end
    • 下面是工厂类(依赖实例化运算类实现具体功能)

    • 接口文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #import <Foundation/Foundation.h>
    #import "OperationAdd.h"
    #import "OperationDiv.h"
    #import "OperationSub.h"
    #import "OperationMul.h"
           
    @interfaceOperationFactory:NSObject
    +(Operation*)CreateOperate:(char)operate;
    @end
    • 实现文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #import "OperationFactory.h"
         
    @implementationOperationFactory
         
    +(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;
       }
       returnoper;
    }
         
    @end
    • 具体调用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #import <Foundation/Foundation.h>
    #import "OperationAdd.h"
    #import "OperationDiv.h"
    #import "OperationMul.h"
    #import "OperationSub.h"
    #import "OperationFactory.h"
       
    intmain (intargc,constchar* argv[])
    {
       @autoreleasepool{
          Operation *oper = [OperationFactory CreateOperate:'*'];          
          [oper setNumberA:1];
          [oper setNumberB:2];
          doubleresult = 0;
          result = [oper GetResult];
          NSLog(@"Result is %f", result);
       }
       return0;
    }

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

      That's all!下次继续吧!

    个人总结:运算类的职责是抽象化并提供动作类的共同的行为,动作类继承运算类

                 工厂类的职责是根据需求给你返回需要的动作类,他跟运算类,动作类没有逻辑性的联系,只提供一个环境而已。

  • 相关阅读:
    Intellij中的常用快捷键
    Intelij 中javax.servlet.http.HttpServlet包导不进来
    JDBC工具类与数据库建立连接
    Xms Xmx PermSize MaxPermSize 区别
    图书管理系统(SSH)
    DAO
    spring中的bean
    Intellij页面汉字乱码问题
    Dispatcher initialization failed
    用同一个类对不同表进行访问
  • 原文地址:https://www.cnblogs.com/jinjiantong/p/3087974.html
Copyright © 2011-2022 走看看