调用构造函数的设计模式

时间:2013-07-01 14:47:46

标签: java design-patterns constructor

我有一个带有两个不同构造函数的对象:

public class MyClass {
   public MyClass(arg1, arg2) {
       //constructor
   }

   public MyClass() {};

}

我只需要通过我的软件的特定类调用第二个(第一个可以在任何地方调用)。是否有针对此案例的设计模式?

MyClass和调用类在两个不同的包中,因此包私有构造函数不是解决方案。

2 个答案:

答案 0 :(得分:3)

没有设计模式,可以用一种方式完成。设置一个构造函数public,它将从所有类调用。另一个声明它包私有。现在将此类和具体的内容放在同一个包中。

public class MyClass {
   public MyClass(arg1, arg2) {
       //constructor
   }

   MyClass() {};  // only for the class in the same package

}

所以现在可以使用公共构造函数,而包受保护的构造函数只能由同一个包中的类调用。

另一个选项

您可以使用不同的工厂模式实现

public class MyClass {
   public MyClass(arg1, arg2) {
       //constructor
   }

   public MyClass() {}; 

}

和工厂

public class MyClassFactory{
    public static MyClass createMyClass(Object o){
        if (o instanceOf SpecificClass)
            return new MyClass();
        else
            return new MyClass(arg1,arg2);
    }
}

现在调用

MyClass mC = MyclassFactory.createMyClass(this);

N.B ..我只是忽略了这些论点。您可以使用createMyClass方法传递参数。

答案 1 :(得分:1)

你可以这样做。

public class Test {
    public Test() {
        StackTraceElement[] stack = new Throwable().getStackTrace();
        StackTraceElement topOfStack = stack[0];
        if (!topOfStack.getClassName().equals("mypackage.MyClass"))
            throw new SecurityException("Haha! You are not allowed to call me!");
        // ....
    }
    public static void main(String[] args) {
        new Test(); // Haha! You are not allowed to call me!
    }
}