有意义呀,比如你有个数据库对象 DB,非单例的做法就是每次用时
$db = new DB();
....
$db->query("....");
用单例,你只需要在工厂方法里判断是否已经初始化过了对象,有就返回,第一次就初始化,程序退出时断开(__destruct),用起来就简单了。
$db = DB::getInstance();
$db->query("....");
// 或
$db = DB::getInstance("db2");
$db->insert("xxx", $data);
甚至直接封装成常用函数
DB::query("....");
这样如果你的程序里有很多位于不同层级的地方要使用 DB 对象,只管找 DB 类要就是了,第一次的时候连接,之后都不会重复连接数据库。
单例的应用面很广,可以用在 Cache, Log 等各种资源需要被频繁调用的地方。
哦,你是在拿 Java 的比较呀。单例并非你想的那样必须整个程序(姑且理解为进程吧)一个实例,要看编写的人怎么做的和他的意图。在 Servlet 里有 Request, Application, Session 几个不同的作用域,当然也可以利用 LocalThread 等在线程内共享,我猜想你同事的购物车应该是 Session 或 Application 下的吧,只会对当前会话或应用有效。