原创文章,未经允许请勿转载
大胖的new对象
“小马,请教你个问题,啥是佩奇?啊,不。啥是设计模式?”,大胖啃着雪糕,一副求知欲爆棚的眼色。
“设计模式嘛,就相当于36计,是解决问题的一种谋略。嗯……”,小马捋着自己的空气胡须,若有所思。
“就比如现在你需要安排你儿子去打个酱油,你儿子出发两分钟后,你又发现盐也没了,也需要买。这个时候你会怎么办?你会不会一冲动就想再生一个二儿子派去执行买盐任务呢?”,小马眯起了眼睛。
“什么呀,我都还没有女朋友。对象全靠new,那不是想new几个new几个,嘻嘻嘻。我new一个儿子买酱油,new一个二儿子买盐,再new一个买雪糕”,大胖翘起了二郎腿。
“那你知道每new一个对象的资源开销么?”,小马似乎看到了大胖的很多问号。
“可不都是这么实现的么?不然怎么做?”。
“问得好,那就来看看设计模式之独生子女-单例模式吧!”。
独生子女-单例模式
在oop编程中,设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
单例模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。笔者认为单例模式是23种设计模式中最简单的之一。
这个模式保证了单例类只能有一个实例,单例类必须自己创建自己的唯一实例。也就是,该模式实行了计划生育,每对父母(单例类)只能有一个唯一子女(单例),也就是只能买酱油完,再让他去买盐,再让他去买雪糕,不能再生了也不允许乱生儿子。
“小朋友,你是不是又有许多问号呀?”,小马调侃大胖。
“是有点懵圈,指教指教呢”。
大胖不用单例模式的代码
这时候该大胖上场了。大胖抡起键盘一顿操作,片刻钟之后,PHP代码出炉了。大胖创建了一个son儿子类,然后分别生了3个儿子去办事。真是男生不嫌生孩苦!敲完代码,大胖似乎也意识到了什么。小声咕噜:“这好像对老婆是有点残忍。”,的大胖把代码提交给了小马。
大胖的代码-儿子类(不要怀疑水印,嗯,那正是本人,已从百家弃坑~~)小马的单例模式代码
小马喝上一口咖啡,二话未说,敲起了代码。号称独生子女的类就这样诞生了。
小马创建了一个父母单例类,创建了静态私有变量来保存儿子实例,私有化构造函数和克隆函数不允许外部调用。通过暴露静态方法getSonInstance()得到唯一的儿子实例。
小马的代码片段1 小马的代码片段2大胖看着新出炉的代码,眼睛圆瞪。
大胖的惊叹
“哇,原来代码还可以这样写呀,单例模式令我大开眼界。果然这就是设计模式的魅力。”,大胖如获至宝。
“嗯,单例模式只允许创建一个对象,由于在系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能,加快对象访问速度。因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。如:1.需要频繁实例化然后销毁的对象;2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象;3.频繁访问数据库或文件的对象。其实最常见的就是PHP中连接mysql的句柄,还有……”。
“哦,我想起来了!单例模式以后真是要多用呢。”,还没等小马说完,大胖就恍然大悟。
“不过,也不能乱用。比如它就不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。”。
“这么说我就明白了。”,大胖早已自我陶醉。
“嗯。其实单例模式只是设计模式中最简单的一种,还有许多更加巧妙的设计模式,都是前辈们的智慧结晶呀。”,小马话音未落,大胖抬头充满着无限的憧憬……
网友评论