【问题标题】:Should I create protected constructor for my singleton classes?我应该为我的单例类创建受保护的构造函数吗?
【发布时间】:2010-12-08 00:49:28
【问题描述】:

按照设计,在Singleton 模式中,构造函数应标记为私有,并提供一种创建方法来重新调整同一类型实例的私有静态成员。我只创建了这样的单例类。

public class SingletonPattern {// singleton class

    private static SingletonPattern pattern = new SingletonPattern();

    private SingletonPattern() {

    }

    public static SingletonPattern getInstance() {
        return pattern;
    }

}

现在,我必须扩展一个单例类来添加新行为。但是私有构造函数不允许定义子类。我正在考虑将单例基类的默认构造函数更改为受保护的构造函数。

如果我将构造函数定义为protected,会出现什么问题?

寻求专家意见....

【问题讨论】:

    标签: java design-patterns singleton


    【解决方案1】:

    如果您通过继承扩展一个单例类,那么如果有人抓住您的单例和原始单例,您将有 2 个单例类的实例在运行。

    如果最初的单例在概念上真的应该是单例,那么使用组合可能是要走的路。但是,这样就失去了可替代性(您的类不能替代原始单例;它只是使用它)。

    你有具体的例子吗?

    【讨论】:

      【解决方案2】:

      如果你这样做,它就不是单例了。但也许你真的不需要单例。

      【讨论】:

        【解决方案3】:

        这不是单例类。想象一下,我可以调用 getInstance() 静态方法 n 次,并且我可以拥有此类的 n 个对象,因此完全违反了单例模式。要使其成为单例,您应该在 getInstance() 方法中检查对象是否已经创建。如果已经创建,那么您应该忽略并且不要再次创建。比如你可以这么类似,语法错误请忽略,只是一段代码解释一下,不同语言可能会有差异。

        public class SingletonPattern {// singleton class
        
        private static SingletonPattern pattern = new SingletonPattern();
        
        private SingletonPattern() {
        
        }
        
        public static SingletonPattern getInstance() {
            if(SingletonPattern == null) {
                return new SingletonPattern();
            }
        }
        

        【讨论】:

          【解决方案4】:

          我知道的老问题,但碰巧偶然发现了这个问题,并认为我可以添加一些有用的东西。

          在单例类中可以有一个受保护的构造函数。如果您想在 Singleton 上具有多态行为,可以将其设为抽象类,将构造函数设置为 protected 并将实例的创建委托给具体子类之一。

          我在“设计模式解释”一书中找到了以下示例:

          abstract public class Tax{
              static private Tax instance;
          
              protected Tax() {};
          
              abstract double calcTax( double qty, double price);
          
              public static Tax getInstance() {
                // code to determine what implementing class to use
                instance = USTax.getInstance();
                return instance;
              }
           }
          
          public class USTax extends Tax {
               private static USTax instance;
               private USTax() {  
             // instantation local members +  Tax abstract class
           }
          
           public double calcTax ( double qty, double price){
             // implementation
           }
          
           public static Tax getInstance() {
               if(instance == null) 
                  instance = new USTax();
               return instance;
            }
           }
          

          【讨论】:

            猜你喜欢
            • 2011-10-23
            • 1970-01-01
            • 2011-05-30
            • 1970-01-01
            • 2021-02-03
            • 2016-01-09
            • 2023-03-15
            • 1970-01-01
            • 2015-07-09
            相关资源
            最近更新 更多