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有自动垃圾收集,但只是想知道我在视频讲座中看到的内容是否相关.
有一些人会说没有一个单身人士的实施是正确的,但我不是那个阵营.
人们经常倾向于使用它们(例如作为上帝的对象),但他们仍然有自己的位置(在我看来,这与这个答案没什么关系).
出于这个答案的目的,我将假设你已经做出了正确的决定,需要一个单身人士,但我确实敦促你阅读它的潜在问题 - 可能有更好的方法来达到目的.
话虽如此,我不确定您的代码示例是否正确.单例应该返回一个且只返回一个实例,如果需要则创建一个实例,如果没有,则为您提供先前创建的实例.
我没有看到您的第一个代码示例如何表彰该合同.它会在第一次调用时给你一个新的,然后它会给你什么.
而你的第二个代码示例似乎根本不会阻止多个对象.
因此,我就会想非常仔细地考虑是否要继续在观看视频,如果这是他们交付教育质量.
在任何情况下,我更喜欢只构造一次的那个,因为你只应该拥有该类的一个对象.换句话说,正确同步的静态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)