iOS与Java原型设计模式,欢迎扫二维码加入订阅号进行讨论

  1. 什么是原型模式
  2. 什么时候用到原型模式
  3. 原型模式有那些优缺点
  4. oc与java语法上原型模式有那些异同及简单的例子
  • 首先看什么是原型模式:

java:Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.(用原型实例制定创建对象的种类,并且创建一个新的对象从原型对象拷贝而来。)

iOS:客户端知道抽象prototype类,在运行时,抽象Prototype子类的任何对象都可以按照客户端的意愿被复制,因此无需手工创建就可以制造同一个类型的多个实例。

根据两者定义可以看出,原型模式就是,通过复制对象来创建新的实例。核心关键就是复制。

我们看一下iOS与Java原型模式的通用类图:

Java:

iOS:

从他们的原型模式图可以看出他们有一个关键的方法:clone-克隆方法。从定义我们也不难得出原型模式就是对Prototpye对象的复制。

  • 什么时候用原型模式

根据定义可以知道原型模式的核心就是clone或者copy,那为什么我们不直接new一个对象或者alloc一个对象反而要通过复制来得到对象呢?

首先比较直观的就创建起来比较麻烦,不是简单的new或者alloc。我们先看一些书上的描述:

  • 需要创建的对象应独立于其类型与创建方式
  • 需要实例化的类是在运行时决定的
  • 不想要与产品层次相对应的工厂层次
  • 不同类的实例之间差异仅是状态的若干组合,因此复制相应数量的原型比手工实例创建更方便
  • 类不容易创建,比如每个组件可把其他组件作为子节点的组合对象。复制已有的组合对象对副本修改会更加容易

首先这些文字很绕口,先找比较好理解的解释,需要要实例化的类是在运行时才决定,这个什么意思呢,我的理解就是这个对象是一个组合对象,比如一个树形结构的对象,不知道他具体的实现,也没法创建,所以我copy一份。

不同实例之间差异仅是状态的组合,这个也比较好理解,比如我画一个小人头,但是我需要很多小人头他们只是颜色不一样,黄中,白种,黑中,我不必把他们都重新画一边,我只需要画出一个来,其他都复制于他,然后修改颜色就可以。

类不容易创建,这个就更好理解,我们创建一个类需要很多步骤,比如分配内存,然后加载数据,数据有来自数据库等等,所以copy更节约资源。

不想要与产品层次相对应的工厂层次 与 需要创建的对象应独立于其类型与创建方式 我的理解就是这样情况用new或者alloc会很不合适比如一个程序有很多人参与一个程序员可能只负责编写其中的一块,当你尝试编写一个完全符合DIP的系统时,你可能无法避免要创建符合特定接口的新对象,但因为DIP原则不允许你依赖具体类型,完全无法决定要创建哪一个具体类,这个时候,原型模式提供了一个很讨巧的办法:“我要创建一个跟它类型一样的对象!这个欢迎大家讨论。

  • 原型模式有那些优缺点

上面的描述中基本上都是原型模式的优点,他的缺点就是每个原型类都需要实现copy方法,如果类的某个对象不支持复制,那就会遇到很多麻烦。

  • oc与java语法上原型模式有那些异同简单的例子

首先他们都有一个关键点-复制,iOS里面有深浅复制,当然java里面也有 我们可以用一个共性的图来表示一下

大体来说就是浅拷贝只是拷贝的指针,资源没有复制,被拷贝的指针都指向同一块内存区域,*p修改任何一个都会修改资源,深拷贝就是完全两个对象,当然资源也被复制。

java中有的基类Object类中有一个clone方法,这个方法就是原型模式的关键。Java原型模式的通用源码

  • public class Niuqhclass implements Cloneable {
  • @Override
  1. public myclass clone()
  2. {
  3. Niuqhclass niuqh = null;
  4. try {
  5. niuqh = (Niuqhclass)super.clone();
  6. }
  7. catch(CloneNotSupportedException e)
  8. {
  9. e.printStackTrace();
  10. }
  11. return niuqh;
  12. }

iOS的实现方式则主要是要实现NSCopying,重写copyWithZone:的方法。

还是直接上例子:假如有一天易车网互联网排名世界第一了,需要在美英日三国分别成立一个公司,公司架构和现在的一样,我们来看看java和iOS的两种实现:

java:

  1. package MyClass;
  2. /*
  3. * 易车网类
  4. * 只列举了ceo和员工当然实际情况是一个树形的结构比这要复杂的多
  5. * 这个实现了 接口 Cloneable 重写了 public clone()方法
  6. * */
  7. public class Yiche implements Cloneable {
  8. public Yiche() {
  9. }
  10. ceo
  11. private String ceo;
  12. private String employee;
  13. @Override
  14. public Yiche clone()
  15. {
  16. Yiche yc = null;
  17. try {
  18. yc = (Yiche)super.clone();
  19. }
  20. catch(CloneNotSupportedException e)
  21. {
  22. e.printStackTrace();
  23. }
  24. return yc;
  25. }
  26. 相关的set/get方法
  27. public String getCeo(){
  28. return ceo;
  29. }
  30. public void setCeo(String ceo){
  31. this.ceo = ceo;
  32. }
  33. public String getEmployee()
  34. {
  35. return employee;
  36. }
  37. public void setEmployee(String employee){
  38. this.employee = employee;
  39. }

场景类

  1. private static int MAX_COUNT =3;
  2. public static void main(String[] args) {
  3. int i = 0;
  4. 把易车模版定义出来
  5. Yiche yc = new Yiche ();
  6. yc.setCeo("李斌");(CEO只有一个)
  7. while(i<MAX_COUNT)
  8. Yiche cloneyc = yc.clone();(拷贝一个模版,添加员工)
  9. yc.setEmployee("随机人");(员工有很多不一样的 人)

这样就产生了三个子公司 可以派往 美国 英国 日本,这样复制比重新编写一个树形的对象要简单的多在看iOS中的实现

首先iOS里面要先写一个接口(协议protocol)IYiche他继承了NSObject协议。这里注意NSObject类和NSObject协议的区别以及为什么苹果这么实现,这里就不再讲了。

  1. #import <Foundation/Foundation.h>
  2. @protocol IYiche <NSObject>
  3. @property(nonatomic,retain)NSSting *ceo;
  4. @property(nonatomic,retain)NSSting *employee;
  5. -(id)copy;
  6. @end
  7. 易车公司实现了协议IYiche
  8. #import <Foundation/Foundation.h>
  9. #import "IYiche.h"
  10. @interface Yiche : NSObject<NSCopying,IYiche>
  11. {
  12. @protected
  13. 子公司自己的想要加的实例
  14. }
  15. @property(nonatomic,retain)NSSting *ceo;
  16. @property(nonatomic,retain)NSSting *employee;
  17. -(id)copyWithZone:(NSZone *)zone;
  18. @end

这里会有一个问题为什么不是接口的中的copy方法而是

-(id)copyWithZone:(NSZone *)zone;方法,首先IYiche实现了NSCopying协议接口查看api在这个协议里面是没有copy方法的,这个方法在NSCopying类中,NSCopying类接受到copy消息,会想采用了NSCopying协议的子类转发消息,子类需要实现NSCopying协议中定义的-(id)copyWithZone:(NSZone *)zone;方法。NSCopying协议没有copy方法所以才才让IYiche声明了。看一下此方法的实现

#pragma mark -

#pragma mark NSCopying method

//此方法需要实现,以支持备忘录

-(id)copyWithZone:(NSZone *)zone

{

// 在这里使用self class 是希望其子类也能返回和子类一样的类型

Yiche *yichecopy = [[[self class]allocWithZone:zone]init];

return yichecopy;

}

具体的场景类就不再写了,主要是说明原型模式的简单例子,再写的时候也感觉到有一些不足,觉得能理解的东西在写的时候也感觉不那么敢确定,本文主要参考了Object-c编程之道,设计模式之蝉,COCOA设计模式。如果有理解不到位的地方希望大家提出自己的意见,给予改正。

请大家关注ios编程与大数据进行讨论:

时间: 2024-10-10 01:39:03

iOS与Java原型设计模式,欢迎扫二维码加入订阅号进行讨论的相关文章

扫二维码关注服务号同时发现金红包

本文只是记录一下自己最近开发的一个小功能,方便以后查看. 一.需求原文如下: 1.vip微信参数配置 1)是否启用 2)设置每单最大红包金额    (例如5 ) 3)设置各类别 红包金额范围 钻石    3-5 黄金    2-3  等等 2.质量保证单 打印二维码 参数传销售门店 以及销售单号 客户扫码 1)自动关注服务号 2)自动匹配客户档案 openid 匹配到档案的增加积分以及总积分 , 未匹配到档案的  客户填写  姓名,手机号 如果手机号匹配到记录  自动将客户档案关联上 手机号也未

前端JS调用微信扫一扫二维码

来源: 最近做一个项目,H5页面,在微信中打开,里面有个功能,就是  点击按钮弹出微信二维码扫一扫. 项目截图: 暂时没有图,下次再补上.就是页面点击按钮,弹出扫二维码的窗口 我只负责前端,所以只上前端代码,后端代码是java. HTML代码(如下):我用的是jQuery WeUI 框架快速开发(jQuery WeUI地址:http://jqweui.com/),所以a标签有样式 1 <a class="weui-btn weui-btn_primary submit-btn"

很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天做个demo(续集)

有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用.(浏览器自带的扫描就够了,QQ扫码和微信扫码部分手机不能直接连接wifi) 在看之前你可以扫一扫下面几个二维码先看看效果: 上篇网站介绍了一下常用格式(http://www.cnblogs.com/dunitian/p/4998714.html),其实扫二维码的本质就是解析出一段字符串,为什么有一些神奇的功能呢?那是字符串的格式满足一些系统内置的协议或者格式,所以系统就帮你干了类似于发短信,打电话,添加联系人,连接wifi

蘑菇街网站的扫二维码登录是怎么做到的?

蘑菇街网站的扫二维码登录是怎么做到的? http://mp.weixin.qq.com/qa/index.php?qa=15867&qa_1=%E8%98%91%E8%8F%87%E8%A1%97%E7%BD%91%E7%AB%99%E7%9A%84%E6%89%AB%E4%BA%8C%E7%BB%B4%E7%A0%81%E7%99%BB%E5%BD%95%E6%98%AF%E6%80%8E%E4%B9%88%E5%81%9A%E5%88%B0%E7%9A%84%EF%BC%9F 想做一个类同蘑

教你不扫二维码不查找公众账号就能一键关注公众账号的方法

第一步:先设置广告编辑 第二步:选择广告模式和微信一键关注 这张图设置好后,需要打印张贴在店里引导客人上网. 上网方法: 1.  手机线连接wifi 2.  打开危险性朋友圈点击任意分线箱连接或扫一扫二维码 3.  点击一键关注 手机端操作: 1.连接wifi 2.打开微信——朋友圈 3.点击任意分享连接 4.出现一键关注界面 5.点击关注 6.点击确定 最后跳转到分享连接内容 现在手机的网络已经完全打开 教你不扫二维码不查找公众账号就能一键关注公众账号的方法,布布扣,bubuko.com

网页授权——扫二维码获取openid

最近做微信公众平台开发项目时遇到这样一个功能需求:生成一个特定url的二维码,用户扫描二维码后跳转到这个url指定的页面,并在这个页面获得用户的openid.这个功能主要涉及到两方面的技术:生成二维码,网页授权. 1. 生成二维码: 生成二维码比较简单的方法是直接使用phpqrcode程序包(可在网上下载得到). 若想获得ThinkPHP支持,需将程序包放在ThinkPHP/Extend/Vendor目录下,让后在程序中引用,代码如下: vendor("phpqrcode.phpqrcode&q

微信加关注链接 一键关注公众号 解决用手机看网页无法扫二维码的烦恼

现在很多网页都会设置wap手机版,移动端的流量逐渐显现.问题来了,如果你用手机浏览网页,你又很想微信加关注,上面正好有个二维码,苦于手机分身无术,又不想打一长串的微信号,还是舍弃吧.站长们可要在这方面提高用户体验了.那么有没专用的微信加关注链接一键关注公众号呢?幸好微信团队早就发明了微信文字链接,只是我们平时没有发现而已. 我们平时的文字链接或其他链接(A标签)一般都是<a href="http://开头的,这种链接在微信中也是通用的,具体可以查看微信添加文字链接一文.这里要说的是微信加关

Java中使用验证码和二维码

资源 需要:   jelly-core-1.7.0.GA.jar 网站:   http://lychie.github.io/products.html 将下载下来的 jelly-core-1.7.0.GA.jar 丢到项目里,不需要编写任何 java 代码,只需要在项目的 web.xml 文件中配置相关信息即可. 验证码 基于 Servlet 实现,在 web.xml 中配置即可使用.并支持自定义样式,常用的配置项见下表: 属性名称 属性描述 默认值 可选值 border 边框 no no,y

【扫一扫二维码,传智大礼包带回家】

[扫一扫二维码,传智大礼包带回家]扫一扫下方二维码或者搜索微信公众账号cditcast就可以即时获得最新最全的传智播客成都中心教学资源,转发这条微博并@传智播客成都中心 你就有机会获得传智播客教学光盘一整套.传智特刊全年12期一整套.传智鼠标垫.传智迷T-shirt等精美礼物,活动公平公正公开.成都传智播客官网:http://cd.itcast.cn?140806ls [扫一扫二维码,传智大礼包带回家]