我一直在寻找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;
}
}
}
实施1中类是否已经实例一旦构造不叫。 要么
Class Customer{
int x;
static int count = 0;
public Customer()
{
if(count == 0)
{
x = 1;
count++;
}
else
{
return;
}
}
实施2中调用构造函数,不论天气的类实例化已经一次与否。 我看了一个视频在线讲座,说实现2不是优选的,因为尽管该对象不是实例第二次的构造函数分配内存。 我知道Java有自动垃圾回收,但只是想知道如果我在视频讲座看着是相关的。
有一些会说, 没有一个单独的实施是正确的,但我不是在该营地相当。
人们往往倾向于不好使用它们(作为神的对象,例如),但他们仍然有自己的位置(在我看来,其中有一点这样的回答做)。
对于这个答案的目的,我会假设你已经在做需要一个单身正确的决定,但我劝你在它的潜在问题读了 - 有可能是一个更好的方式来实现自己的目的。
话虽如此,我不知道,如果你的代码示例是正确的反正。 一个Singleton应该返回一个且只有一个实例,如果有必要创建一个,给您以前创建一个如果不。
我看不出你的第一个代码示例荣誉那份合同。 它会给你一个新的第一次,它被称为,那么它会给你以后什么都没有 。
和你的第二个代码示例似乎并没有阻止多个对象都没有。
所以我会非常仔细地约你是否要继续在观看视频,如果这是他们交付教育质量思考。
在任何情况下,我更喜欢一个唯一,因为你只应该有这个类的一个对象构造一次。 换句话说,静态getMe()
调用正确同步以防止竞争条件允许多于一个的创建Me
的对象,并创建一个新对象第一次,在后续调用返回相同的对象。
在伪代码,这将是这样的:
class Me {
private Me() {};
private static Me *loner = NULL;
public static synchronised Me *getMe() {
if loner == NULL
loner = new Me();
return loner;
}
}
写一个正确的单身并不那么容易。 你需要照顾的竞争条件和抵御反射攻击。 例如,一个私有的构造可能是通过反射调用创建对象的另一种实例。 在Java中最简单和最安全的单身实现与枚举完成:
enum Singleton {
INSTANCE;
}
这是因为枚举常量由JLS spedified是单身(部分JLS 8.9):
一个枚举类型没有比由它的枚举常数定义的其它实例。