设为首页 收藏本站
查看: 927|回复: 0

[经验分享] 魔兽争霸之PHP设计模式-单件模式[Singleton]

[复制链接]

尚未签到

发表于 2017-4-9 11:52:53 | 显示全部楼层 |阅读模式
  前言:我写的关于设计模式的一系列文章。这系列的文章主要针对没接触过设计模式的,或者说接触过但还不是很明白的PHPer。

问题的提出:
可能很多人都写过类,文件操作的,数据库的……
对于数据库的类来说有时候可能被忽略的一个问题是:我们创建类的实例时一般都是通过构造函数连接了数据库。这没错。但是如果我们不注意地创建了多个实例,那么对于数据库资源而言是一种浪费。所以使用单件模式在解决这个问题上就显得很有必要了。

单件模式的作用:
从上面可以看出,单件模式的引入是为了使类的实例只有一个。
那么下面开始我们的类的设计。这里就不以数据库为例子了。从标题可以很明显看出,我这个系列的文章都是以魔兽争霸为例子的。
想玩游戏,那么先打开应用程序WarThree:
  <?php/**创建一个魔兽争霸3的应用程序类*/class WarThree{public function __construct(){echo 'Open war3.exe<br/>';}}$war = new WarThree();//这样貌似没什么问题。但如果你不小心打开了2个魔兽争霸呢?//尝试下面语句$war_again = new WarThree();echo  ($war !== $war_again) ? 'Error:War3.exe is already running' : 'Have a good time in the game';?>
  相信你已经知道了上面代码存在的问题了。
那么,如果我们对类的实例化这一过程进行控制,也就是说不给用户随便打开游戏,我们要在打开之前进行控制。
试试下面代码:
  <?php/**创建一个魔兽争霸3的应用程序类*防止在外部无限打开程序*/class WarThree{//把构造函数改为private的,看你怎么创建我?呵呵private function __construct(){echo 'Open war3.exe<br/>';}}$war = new WarThree();//这时尝试创建对象会发生错误。?>
  总不能不让人玩游戏吧,那干脆卸载算了!
别激动,改下就能玩了嘛,真是的。
  <?php/**创建一个魔兽争霸3的应用程序类*总算可以打开了*/class WarThree{//把构造函数改为private的,看你怎么创建我?呵呵private function __construct(){echo 'Open war3.exe<br/>';}public static function OpenWar(){new WarThree();}}$war = new WarThree();//我打开。咦还不行$war = WarThree::OpenWar();//楼上的,你这不废话吗。我还是private的。不过通过OpenWar就能打开了。$war_again = WarThree::OpenWar();//……我晕,又成功开了两个。echo  ($war !== $war_again) ? 'Error:War3.exe is already running' : 'Have a good time in the game';//又是error……,我不活了……?>

别急,我忘了,是我的错还不行吗……  <?php/**创建一个魔兽争霸3的应用程序类*打上补丁,看你还开两个。你就不能注意点吗?*/class WarThree{private static $mIfRuning = null;//我加这个判断你是不是已经开了魔兽争霸3//把构造函数改为private的,看你怎么创建我?呵呵private function __construct(){echo 'Open war3.exe<br/>';}public static function OpenWar(){//先判断一下先self::$mIfRuning = (self::$mIfRuning == null) ? new WarThree() : self::$mIfRuning;return self::$mIfRuning;}}$war = WarThree::OpenWar();//yeah,进入游戏了$war_again = WarThree::OpenWar();//没反应,想开2个游戏没门,我电脑配置可没那么高echo  ($war !== $war_again) ? 'Error:War3.exe is already running' : 'Have a good time in the game';//享受游戏吧?>

至此,单件模式就搞定啦,再也不用担心不小心开了2个魔兽争霸,玩游戏去咯。什么?!已经凌晨5点多啦?!我晕,先睡个觉先zzzz……
这是我在本论坛第二贴,希望大家多多支持。转载记得请注明出处。谢谢!
以后有时间会继续写魔兽争霸之PHP设计模式。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362381-1-1.html 上篇帖子: PHP无限分类的例子(包括数据库)转 下篇帖子: 解决PHP站点被黑客用于群发垃圾邮件问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表