设计模式初探之原型模式

 

一.前言在项目开发的过程中,想必你遇到优秀的代码设计,都会忍不住去思考或请教大神这种设计是怎么想...



一.前言

在项目开发的过程中,想必你遇到优秀的代码设计,都会忍不住去思考或请教大神这种设计是怎么想出来的。或许对于程序员来讲,精彩的代码是如何想出来的,要比看到精彩的代码更加令人期待。小编准备整理出曾分享的设计模式系列博文,和小伙伴们一起交流,互相学习。

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使代码编制真正工程化,是软件工程的基石脉络,如同大厦的结构一样。

设计模式主要分为三个类型,共23种:

1、创建型模式:原型模式、单例模式、抽象工厂模式、建造者模式、工厂模式;

2、结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式;

3、行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式;

此次先一起学习创建型模式之原型模式。

二.什么是原型设计模式

原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

在Object-C中使用原型模式,首先要遵循NSCoping协议,多数情况下原型模式可被理解为一种深复制的行为。下面简单谈一谈深拷贝和浅拷贝。

三.深拷贝和浅拷贝

深拷贝也叫做值拷贝,新创建的对象会在内存中开辟新的空间,而把被拷贝对象的值拷贝过来;浅拷贝也叫做指针拷贝,新创建的对象的指针与原对象的指针指向相同的内存空间,并有相同的值,浅拷贝的对象就如同原对象的影子。如下图:



四.什么场景使用原型设计模式

首先我们看看原型模式主要解决的问题是:“某些结构复杂的对象”的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。

那么来一起总结它的使用场景:

1、想要的对象并不能够直接通过初始化函数创建出来,其创建过程复杂;

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

3、不通过工厂方法或者抽象工厂来控制产品的创建过程,想要直接复制对象;

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

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

五.Object-C实现原型设计模式

1.创建原型协议并遵守NSObject协议

2.在原型协议中声明copy接口

3.各个子类类遵守原型协议和NSCopy协议

重写- (id)copyWithZone:(NSZone *)zone方法,任何一个继承NSObject的子类,在收到copy消息时就会自动调用该类的copyWithZone方法。

这样就原型模式就实现了,在运行时,任何遵守原型协议对象都可以直接通过copy方法进行复制,并且可以使用遵守原型协议的id类型获取。

六.结语

1,关于深浅拷贝,在OC中一些内置类遵循NSCoping协议,比如NSArry,NSMutableArray,无论是可变还是不可变数组,调用copy,都将得到不可变数组,调用mutableCopy,都将得到可变数组。

2,对于任意门自己模块,像多啦A梦和呼吸条这种对象创建比较复杂,不同类实例间的差异小,在其他场景需要用到此实例的,可以建议考虑复制相应数量的原型,比手动实例化更方便。


    关注 insightLabs


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册