美文网首页
iOS中的设计模式——原型(Prototype)

iOS中的设计模式——原型(Prototype)

作者: UILabelkell | 来源:发表于2017-12-02 11:51 被阅读30次

    原型模式(Prototype):是指使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象。说人话:OC中可以通过深复制来快速而方便的创建一个新对象。

    使用场景
    1.需要创建的对象应独立于其类型与创建方式。也就是说我们想要的对象并不能够直接通过初始化函数来创建出来,其创建过程不具有普遍性且复杂。

    2.要实例化类是在运行时决定的。在编写代码的时候并不知道哪种对象会被创建出来,其内部的结构如何复杂(例如:复杂程度取决于用户的操作)

    3.不想要与产品层次相对应的工厂层次。不通过工厂方法或者抽象工厂来控制产品的创建过程,想要直接复制对象。

    4.不同类的实例间的差异仅是状态的若干组合。因此复制相应数量的原型比手工实例化更加方便。

    5.类不容易创建,比如每个组件可把其他组件作为子节点的组合对象。复制已有的组合对象并对副本进行修改会更加容易。内部结构复杂,不容易重现。

    以下两种常见的使用场景:

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

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

    也就是说,通过初始化方法创建对象时特别繁琐(甚至无法实现),可以考虑使用原型模式深拷贝出一份模型副本。
    <pre>
    @interface Person : NSObject
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) int age;
    @end

    @implementation Person

    • (id)copyWithZone:(NSZone *)zone {
      Person *p = [[[self class] allocWithZone:zone] init];
      p.name = self.name;//需要设置属性
      p.age = self.age;
      return p;
      }
      @end

    Person *p1 = [[Person alloc] init];
    p1.name = @"name1";
    p1.age = 29;

    Person *p2 = [p1 copy];

    NSLog(@"%@:%@, %d", p1, p1.name, p1.age);
    NSLog(@"%@:%@, %d", p2, p2.name, p2.age);

    </pre>

    相关文章

      网友评论

          本文标题:iOS中的设计模式——原型(Prototype)

          本文链接:https://www.haomeiwen.com/subject/xohnbxtx.html