首页 > 直接用静态方法调用和单例模式的区别是什么?

直接用静态方法调用和单例模式的区别是什么?

如题,静态方法是在内存中只初始化一次,而单例模式也是保证在内存中只实例化一个对象,那这两者的区别是什么?我直接把数据库链接放在静态里面不就行了吗


我在从内存上说说吧

static维护至少有且只有一份,单例至多维护有且仅有一份存
内存是有限的,如果把所有的单例都用static来替换,原则上没有问题,但内存会爆的。

单例只有在第一次使用的时候才会占有内存(或者堆栈什么的)


实际上需要具体看类是做什么用的。

以题主的数据库连接作为例子(实际上很多实体都可以作为例子),具体要看把什么当成实体来分析设计:

例如,当我们认为网站是实体,那么把连接数据库这个事情当成网站的一个动作,就是在网站类中实现该静态方法。然而为了节省内存,我们以为这个静态方法在程序初始化时就载入,这样就节省了内存,实际上我们在使用连接数据库的时候仍然是调用了这个方法,仍然需要重新连接一次,在内存中仍然在重复造连接资源。

如果我们把数据库当成一个实体,那么连接数据库这种事情当然是由这个实体来办的,然而为了节省内存,我希望所有用到数据库实体的情况都只使用那个已存在的实例,而不是每次都去创建连接,这时候单例模式就发挥了作用。

那么把谁当成实体这种事情,当然是要看设计者具体应用到什么情况。

为了改善我提到的第一个例子的问题,我们可以在类内写一个静态变量用于存储连接资源:

class website {
    private static $_conn = NULL;
    
    public static function db_conn()
    {
        if (empty(self::$_conn))
        {
            $_conn = ...;//造一个连接
        }
        return $_conn;
    }
}

这样就相当于类似的单例模式保持只有一个资源的情况了。

说了这么多,实际上在使用的时候还是单例模式方便,至少我们可以把对数据库的各种操作封装起来变成一个非常实用的工具类,需要的时候就载入,多好。


一个可继承,一个不可继承。


其实没有搞明白题主想问什么。

单例模式是针对类的,静态方法是方法而已,跟对象没有直接联系。


我想楼主问的是,可以把实例化后的对象,存放在一个静态变量里,这样每次需要用对象的时候直接使用静态变量里的就行了,就像CI里那样,是不是呢


当然不同,思考一点,静态方法里能用 this 吗?


单例模式是针对类实例的,静态方法是属于类的方法。静态数据成员和单例有只初始化一次的特点,可以用静态成员来实现单例模式。

【热门文章】
【热门文章】