喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

上一主题 下一主题
 13  1/2  1  2  > 
     
标题: [原创] 设计模式之我见 浅谈寄存器(注册模式)  
 
sanshi0815 (sanshi0815)
高级会员
Rank: 4
中级会员



UID 63534
精华 1
积分 533
帖子 669
金钱 523 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2005-3-18
状态 离线
设计模式之我见 浅谈寄存器(注册模式)

最近有个朋友一起在跟我说寄存器或者叫注册模式,然后另外一个朋友,给了我一个地址,
让我去看,我看完后很茫然,对php的运行方式产生了诧异,开始怀疑自己是不是在
很多地方理解错了,然后我去求证,问了一些朋友,有的朋友还做了测试,证明我当初的认识是正确的,
所以可能很多朋友,也看完了 这些设计模式后,产生了很激动的表现,发现了自己会了这个模式然后就拿到了,php项目里去。
先表明一个态度,我是希望php oo的,但是由于php本身的一切缺点,php不适合oo的很彻底,所以我感觉
做php的程序员,应该兼顾扩展代码重复利用同时照顾下效率,不要继承的过多,使用过多的类,加上过多的层来解决一些问题,好了这些都是我自己对php oo的一些看法,属于扯淡类型的。下面说点正经的

如果大家有时间的话,我给你们2个url
http://blog.phpsoho.com/read.php/80.htm
还有一个
http://blog.phpsoho.com/read.php/81.htm
看完这2个您就能更明白 注册模式了,看完了以后是不是特别想在自己的程序中,也应用下这个设计模式呢?我想一定的,因为这个东西的很好。

咱们现在说点别的,php里的变量,类,等等,他的有效范围在那里呢,是一个页面里,或者可以说是在生成html这前,html生成了,这些变量就失效了,至少不能在改变了,而且他的下一个页面,不能使用这个页面里的私有变量了。
那么我们在一个页面里声明了一个类,调用这个页面,类实例化了,那么并发请求同一个页面,这个是不是就可以不被 其他页面实例化了呢,答案是 否定的,那么下次紧跟着在打开这个页面的时候,在这个新打开的页面里,这个是否可以不被实例化就能使用了呢,答案也是否定的。

在说一下 注册模式的好处:可能很多人都知道,它的好处就是 减少了类的多次声明,建立了一个类池或者叫对象池,你需要什么直接去取,如果没声明,我给你声明一个,如果声明了,我给你一个声明好的,减少了这个类的多次声明,减少了内存的使用,提高的程序的执行效率。

好,现在我们做一个假设,我们一个页面里只连接一次数据库执行一条sql,就够了。我们对数据库进行了封状是一个数据库的操作类。这个时候,我们直接使用

<?php
$db 
= new mysqlDB();
$result=$db->query("select * from table");
?>
如果我们使用注册模式

$registry = new Registry();
$registry->set('db',$db);
$registry->set('action','query');
$result = $registry->get('sql','select * from table');
现在我们说下 Registry 这个类 大家看下基本的思路,我并不写一个具体的实现,只是让大家明白好处

<?php
class Registry
{
     var 
$_object = array();
    function 
set($name,$object)
    {
        
$this->_object[$name] = $object;
    }
    
fnction get($name)
    {
        
renturn $this->_object[$name];
    }
}
?>
现在我们说一下,在我们没有使用注册模式的时候,我们直接使用数据库操纵类,就完成了。
现在有一个前提,我们只对数据操纵一次
那么使用注册模式,我们要多为这个注册模式 多声明一个类。然后还要多加一些操作,说实话这些都是没有必要的。所有说这样的情况下,使用注册模式是浪费的。

那么大家又要说了,这么经典的模式 在其他的语言中有着经典的应用,人家使用这么久了,就一点好处都没了。
好,我给大家说下这个问题,如果我们要对数据做,做很多次的操作,同时,我们当初封闭方法的时候,我们每个方法都都是独立的,然后我们还有很多类,我们也要重复声明使用的,这个时候我们使用注册模式才能 体验出这个经典的设计模式的好处来。
这个东西可以扩展下,在asp中,跟jsp中应该是同样的道理,但是在j2ee跟其他的程序中,我想就不一样了,我是这样理解的,想java中的j2ee本身jsp只是完成了一个展示层,实际的一些东西都是由java完成的,而java又是比较地层的他里面的变量跟资源是存在内存里的,并不是这个页面关闭了,就消失了,所以这样的设计模式在j2ee的开发中,使用是很合理的,当然也包括其他的语言,在像php这样的语言里,应该适当考虑下,这样的开销是否值得,是否必要,使用其他的设计模式的同时也是一样。
请大家拍砖吧。


作者:sanshi0815
mail : sanshi0815@tom.com
2007-4-1 01:36 AM#1
查看资料  Blog  发短消息  QQ  顶部
 
C.J.Liu (C.J.Liu)
新手上路
Rank: 1
初级会员



UID 21202
精华 0
积分 22
帖子 22
金钱 22 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2003-6-30
状态 离线
[推荐阅读] 关于从数据库中取出数据再排列的问题?
设计模式有很多种,不管怎样只要做到适合当前项目就好了
2007-4-1 04:38 AM#2
查看资料  发短消息  顶部
 
奶瓶
新手上路
Rank: 1



UID 90299
精华 0
积分 9
帖子 13
金钱 9 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2007-3-28
状态 离线
[推荐阅读] 跟女朋友失去联系了
$result = $registry->get('sql','select * from table');

function get($name)
    {
        renturn $this->_object[$name];
    }

LZ,这两个如何理解?参数不一样啊




立志成为真奶瓶
2007-4-1 02:35 PM#3
查看资料  发短消息  顶部
 
sanshi0815 (sanshi0815)
高级会员
Rank: 4
中级会员



UID 63534
精华 1
积分 533
帖子 669
金钱 523 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2005-3-18
状态 离线
[推荐阅读] PHP网站创业项目招技术合伙人


QUOTE:
原帖由 奶瓶 于 2007-4-1 02:35 PM 发表
$result = $registry->get('sql','select * from table');

function get($name)
    {
        renturn $this->_object;
    }

LZ,这两个如何理解?参数不一样啊
没的解释,这只是个大概的东西,不一定能运行,只是说明下,注册模式的大概原理,那个方法你可以自己完善的,真够讨厌的
2007-4-1 05:34 PM#4
查看资料  Blog  发短消息  QQ  顶部
 
奶瓶
新手上路
Rank: 1



UID 90299
精华 0
积分 9
帖子 13
金钱 9 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2007-3-28
状态 离线
[推荐阅读] 寻求PHP网站创业项目招技术合伙人


QUOTE:
原帖由 sanshi0815 于 2007-4-1 05:34 PM 发表

没的解释,这只是个大概的东西,不一定能运行,只是说明下,注册模式的大概原理,那个方法你可以自己完善的,真够讨厌的

说我讨厌吗




立志成为真奶瓶
2007-4-1 05:45 PM#5
查看资料  发短消息  顶部
 
henanren
注册会员
Rank: 2
中级会员



UID 64137
精华 0
积分 197
帖子 386
金钱 29 喜悦币
威望 0
人脉 168
阅读权限 20
注册 2005-5-16
状态 离线
[推荐阅读] 谁有静态生成的代码,比较好用的?
讲的不错!、可惜目前还没有办法用php实现
2007-4-1 05:46 PM#6
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
henanren
注册会员
Rank: 2
中级会员



UID 64137
精华 0
积分 197
帖子 386
金钱 29 喜悦币
威望 0
人脉 168
阅读权限 20
注册 2005-5-16
状态 离线
[推荐阅读] 请教一个关于图片上显示中文字体的问题
奶瓶 ?怎么又出来一个 阿
2007-4-1 05:48 PM#7
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
showe (showe)
注册会员
Rank: 2
中级会员



UID 18697
精华 0
积分 178
帖子 173
金钱 178 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2003-3-4
状态 离线
[推荐阅读] 国内申请 PHP + MySql 域名和空间
嗯,效率低了,是不是会超时
2007-4-1 08:45 PM#8
查看资料  发短消息  顶部
 
unspace (未知空间)
版主
Rank: 7Rank: 7Rank: 7
百万富翁


UID 67567
精华 0
积分 48889
帖子 4988
金钱 47809 喜悦币
威望 0
人脉 1080
阅读权限 100
注册 2005-12-28
来自 吉林
状态 在线
[推荐阅读] 兼职:网站制作 网页设计 网站维护
好东西,顶一个,让俺看到了 叁石 的光环



7月1日起,北京市低保、最低工资标准、失业保险、工伤保险、基本养老金5项社会保障标准均将全部上调。其中,最低工资标准增加70元,提高到800元。
2007-4-2 10:00 AM#9
查看资料  访问主页  Blog  发短消息  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 悬赏销售高手


QUOTE:
原帖由 sanshi0815 于 2007-4-1 01:36 发表
$registry = new Registry();
$registry->set('db',$db);
$registry->set('action','query');
$result = $registry->get('sql','select * from table');
...
这里的
$result = $registry->get('sql','select * from table');
是不是$result = $registry->get('db','select * from table');吧?因为之前注册的是db对象,调用的时候应该也用db对象吧?

说起封装,够用,简单就行,不一定要oop的。个为这样认为....




五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2007-4-2 10:37 AM#10
查看资料  访问主页  Blog  发短消息  QQ  顶部
 13  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.043828 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP