这是错误的单例模式实现的正确演示吗?

时间:2017-07-24 04:00:09

标签: java design-patterns

我从这里了解了单身模式http://www.oracle.com/technetwork/articles/java/singleton-1577166.html,并描述了一些常见的实现错误。我只是想检查一下我写的这些程序是否证明它们不正确。

在第一个程序中,我创建了一个继承的类,并调用了基类的受保护构造函数。这允许我创建2个Singleton实例。

import java.util.*;
import java.lang.*;
import java.io.*;

class Singleton {
    public static Singleton Instance() {
        if (_instance == null) {
            _instance = new Singleton();
            return _instance;
        }
        return _instance;
    }
    protected Singleton() {}
    private static Singleton _instance = null;
}

class SingletonBasher extends Singleton {
    public SingletonBasher() {

    }
}

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Singleton x = new Singleton();
        Singleton y = SingletonBasher.Instance();
        if(x != y)
            System.out.println("fail!");
    }
}

在第二个程序中,我只使用new运算符创建了两个对象,这是有效的,因为构造函数受到保护。如果它是私有的,我会被迫使用Instance方法,它只允许我创建1个实例。

import java.util.*;
import java.lang.*;
import java.io.*;

class Singleton {
    public static Singleton Instance() {
        if (_instance == null) {
            _instance = new Singleton();
            return _instance;
        }
        return _instance;
    }
    private Singleton() {}
    private static Singleton _instance = null;
}


class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Singleton x = Singleton.Instance();
        Singleton y = Singleton.Instance();
        if(x != y)
            System.out.println("fail!");
    }
}

1 个答案:

答案 0 :(得分:0)

这个Singleton类适用于单线程程序。如果您希望在多线程程序中运行它。你需要;

  1. 急切地初始化_instance变量,如下所示

    private static Singleton _instance = new Singleton();

  2. Instance()的访问权限与{{p}}次检查同步。