如何使构造函数仅可用于工厂类?

kar*_*ins 6 java oop singleton class

好吧,问题可能不是很清楚.我来详细介绍一下:

假设我有一个名为CFactory的Shoe(CShoe)对象工厂类.CFactory是一个单例类,使用简单的hashmap创建和存储所有instanciated鞋.然后通过静态方法访问它以使用创建的对象.

有没有办法强制CShoe的构造函数,以便它只能由工厂调用?(换句话说,确保鞋子的制作只能由鞋厂单身人士而不是其他班级完成)

Igo*_*kon 5

您可以授予CShoe构造函数包访问权限,并将CShoe和CFactory放在同一包中。


bru*_*nde 5

你可以做Shoe一个inner classShoeFactory:

public class ShoeFactory {

    public static class Shoe {
        private String name;

        private Shoe() {
        }

        private Shoe(String name) {
            this.name = name;
        }
    }

    public static Shoe createShoe(String shoeName) {
        return new Shoe(shoeName);
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这几乎涵盖了所有情况,除了...... 反思:

public class SmellyShoe {

    public static void main(String[] args) {
        try {
            java.lang.reflect.Constructor c = Shoe.class.getDeclaredConstructors()[0];
            c.setAccessible(true);
            Shoe smelly = (Shoe)c.newInstance(null);
            // grr
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)