zoukankan      html  css  js  c++  java
  • OC编程之道-创建对象之原型模式

    一 什么是原型模式?(what)

    有些对象的创建代价过大或过于复杂,要是可以重建相同的对象并作轻微的改动,事情会容易的多(效率变高)。典型的例子是复制组合结构(eg树形结构),从零开始构建一个树型组合体非常困难。可以通过轻微的改动重用已有的对象,以适应程序中的特定情况。

    原型模式属于创建性设计模式,通过拷贝的方式快速创建一个对象,这里拷贝的方式有两种1)浅拷贝2)深拷贝。

    二 何时使用原型模式?(where)

    1要实例化的类要在运行时才确定。

    2很多相关的类,其行为略有不同,而且主要差异在于内部属性,如名称、图像等。

    3需要使用组合(树型)对象作为其他东西的基础,例如,使用组合对象作为组件来构建另一个组合对象。

    4需创建的对象应独立于其类型与创建方式。?

    5不想要与产品层次相对应的工厂层次。?

    注意:不管什么对象,只要复制自身比手工实例化要好,都可以是原型对象。

    三 cocoa touch框架中的对象复制

    NSObject有一个实例方法叫做(id)copy,默认的copy方法调用[self copyWithZone:nil]。

    NSObject协议没有声明copy方法。

    NSCopying协议,声明了copyWithZone方法。

    当NSObject型的接收器收到copy消息时,NSObject会一次向其采用了NSCopying协议的子类发送消息。

    四 具体实现原型模式?(how)

    Mark<NSObject>协议

    属性:color,size,location,count,id<mark>lastChild

    方法:-(id)copy,addMark:mark,removeMark:mark,childMarkAtIndex:index;

    Vertex对象用于组成线条,并不包含颜色、大小等其他信息。

    Vertex:NSObject <Mark,NSCopying>

    属性:同上,location_

    方法:同上(除了copy方法),initWithLocation:location,copyWithZone:zone;

    避免编译警告。解释在编程之道的p42页。

    - (id)copyWithZone:(NSZone *)zone

    {

      Vertex *vertexCopy =[[[self class]allocWithZone:zone]initWithLocation:location_];

      return vertexCopy;

    }

     Dot包含颜色与大小,以表示这个点

    Dot:Vertex

    属性:color,size

    方法:copyWithZone:(NSZone *)zone;

    Stroke:NSObject <Mark,NSCopying>

    五 使用

    假定用户选择了一个叫做selectedMark的Mark实例作为图样模板。

    id <Mark> patternTemplate = [selecteMark copy];

    [templateArray addObject:patternTemplate];

    当用户要把先前保存的一个图样模板应用到CanvasView的时候

    id <Mark> patternClone = [templateArray objectAtIndex:patternIndex];

    [currentMark addMark:patternClone];

    [canvasView setMark:currentMark];

    [canvasView setNeedsDisplay];

  • 相关阅读:
    -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
    map合并,相同键对应的值相加
    oracle截取字符串去掉字段末尾指定长度的字符
    springMVC结合AjaxForm上传文件
    hibernate中指定非外键进行关联
    Maven安装及MyEclipse中使用Maven
    js判断字符串出现的次数
    PL/SQL如何调试sql语句、存储过程
    如何让pl/sql developer记住密码,实现快速登录
    【学亮IT手记】jQuery each()函数用法实例
  • 原文地址:https://www.cnblogs.com/encoreMiao/p/5198071.html
Copyright © 2011-2022 走看看