• 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];

  • 相关阅读:
    自动配置原理5
    JSR303数据校验4
    mysql 安装(压缩包安装和exe安装)
    jQuery关于复制(复制隐藏文字+显示文字)跳转,Clipboard
    html页面设置一个跟随鼠标移动的DIV(jQuery实现)
    js中将时间(如:2017-10-8 22:44:55)转化为时间搓,时间戳转为标准格式时间
    异常:java.lang.IllegalArgumentException: Control character in cookie value or attribute.
    从数据库导出数据到excel之List<List<Object>>导出
    从数据库导出数据到excel之List<map>导出
    从数据库导出数据到excel之POI操作
  • 原文地址:https://www.cnblogs.com/encoreMiao/p/5198071.html
Copyright © 2020-2023  润新知