最近在做一个项目,数据库访问接口时,自然而然地想到一次HTTP访问时,数据库只建立一次连接。也就是常听到的单例模式。既然涉及到了设计模式,就在图书馆拿了本书浏览下:虽然不学所谓设计模式,很多情况下用的方法也会和一些常用的设计模式重合,但是非常有必要将一些凌乱的编程经验,稍微总结一下提炼下。
下面内容参考自:《深入浅出设计模式》
一、单例模式
类中定义一个静态变量,顺便建立一个函数取处此变量;多线程时,加一次互斥锁即可。
二、简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式:大致是一个类只实现一种类型的功能。(据说有人滥用getter/setter导致代码异常臃肿)
抽象工厂模式:用于简化工厂模式,类似工厂太多了,将其合并到一个抽象工厂中,以便调用。
(属于不知道却自动会用的设计模式。)
三、原型模式(prototype)
原来javascript的prototype来源于此!即新对象克隆自原先的对象。
js中(1)在原型扩展的method/attribute,所有克隆自原型的对象共同拥有它
四、适配器模式
应用场景:A有一个接口,返回int*类型的数据;但B需要vector类型的数据;C需要这些数据set类型的数据,怎么办?
处理:B/C均继承原先对象,重写覆盖原先接口,将int*转换成vector/set,这就是适配器模式。
五、门面模式
提供接口,但是尽量隐藏细节,相对于调用者来说是透明的。感觉和TCP/IP很像,每一层对于其上面的层都是透明的。
六、代理模式
其实还是基于层次的分离。比如一次HTTP请求,需要过滤所有输入,防止恶意代码注入;如果让后端人员自己实现,很可能这边漏一点,那边漏一点;所以很自然的思路就是,独立出一个安全层(即所谓代理),所有get/post请求都会经过这个层,合法的请求会提供给后台,非法请求直接返回失败信息。
(属于不知道却自动会用的设计模式。)
七、享元(FlyWeight)模式
应用:数据库连接池连接池技术。即在一次http连接后,数据库TCP连接并不释放,而是放入连接池中,供下一次连接使用;PHP由于没有常驻内存,每一次连接都会完全销毁旧连接数据,而java web服务器则没有这方面的问题。(php据说有第三方库可以实现连接池)
之前在搞php mysql连接时,使用单例模式,也发现了这个问题:即使时单例模式,每一次连接依然需要一次数据库连接,再释放掉这个TCP连接;查了查,果然还有连接池技术,居然还叫享元模式。。。
其他以后再补。