哪个是更好的单例实现?

Dee*_*k B 2 java singleton design-patterns

我正在研究Singleton模式的这两个实现:

 Class Customer {

int x;
static int count = 0;

private Customer()
{
    x = 1;
}

public static Customer GetCustomer()
{
    if(count==0)
    {
        count++;
        return new Customer();
    }
    else
    {
        return null;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

实现1,如果类已经实例化一次,则不调用构造函数.要么

 Class Customer{

int x;
static int count = 0;
public Customer()
{
    if(count == 0)
    {
        x = 1;
        count++;
    }
    else
    {
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

实现2,其中调用构造函数而不管天气如何,类已经实例化了一次或者没有.我在网上看了一个视频讲座,说实现2不是首选,因为它为构造函数分配了内存,尽管第二次没有实例化对象.我知道Java有自动垃圾收集,但只是想知道我在视频讲座中看到的内容是否相关.

pax*_*blo 6

有一些人会说没有一个单身人士的实施是正确的,但我不是那个阵营.

人们经常倾向于使用它们(例如作为上帝的对象),但他们仍然有自己的位置(在我看来,这与这个答案没什么关系).

出于这个答案的目的,我将假设你已经做出了正确的决定,需要一个单身人士,但我确实敦促你阅读它的潜在问题 - 可能有更好的方法来达到目的.


话虽如此,我不确定您的代码示例是否正确.单例应该返回一个且只返回一个实例,如果需要则创建一个实例,如果没有,则为您提供先前创建的实例.

我没有看到您的第一个代码示例如何表彰该合同.它会在第一次调用时给你一个新的,然后它会给你什么.

而你的第二个代码示例似乎根本不会阻止多个对象.

因此,我就会想非常仔细地考虑是否要继续在观看视频,如果这是他们交付教育质量.


在任何情况下,我更喜欢只构造一次的那个,因为你只应该拥有该类的一个对象.换句话说,正确同步的静态getMe()调用以防止竞争条件允许创建多个对象,并且第一次创建新对象,在后续调用中返回相同的对象.Me

在伪代码中,这将是这样的:

class Me {
    private Me() {};

    private static Me *loner = NULL;

    public static synchronised Me *getMe() {
        if loner == NULL
            loner = new Me();
        return loner;
    }
}
Run Code Online (Sandbox Code Playgroud)