Java 如何使构造函数仅对factory类可用?

Java 如何使构造函数仅对factory类可用?,java,class,oop,singleton,Java,Class,Oop,Singleton,好吧,问题可能不是很清楚。让我提供一些细节: 假设我有一个名为CFactory的Shoe(CShoe)对象工厂类。 CFactory是一个单例类,它使用一个简单的hashmap创建和存储所有实例化的鞋。然后通过静态方法访问它以使用创建的对象 有没有办法强制CShoe的构造函数只能由工厂调用?(换句话说,确保鞋的创建只能由shoes factory singleton类完成,而不能由其他类完成)您可以授予CShoe构造函数包访问权限,并将CShoe和CFactory放在同一个包中。既然您想将每个对

好吧,问题可能不是很清楚。让我提供一些细节:

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


有没有办法强制CShoe的构造函数只能由工厂调用?(换句话说,确保鞋的创建只能由shoes factory singleton类完成,而不能由其他类完成)

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

既然您想将每个对象添加到映射中,那么您也可以将此逻辑移动到CShoe构造函数-对象将添加自己。

您可以将factory对象传递到构造函数中吗

public CShoe(CFactory factory)
{
    if (factory == null ||
          !factory.isValid()) // or whatever
    {
        throw new IllegalArgumentException();
    }
}

您可以使
Shoe
成为
ShoeFactory
内部类

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);
    }
}
我认为这几乎涵盖了所有情况,除了。。。。反思:


难道不能将调用方实例作为shoe的静态成员的参数传递,并在其中执行类似“isInstanceOf”的检查,如果为true,则调用构造函数吗?

首先,如果保留所有创建的实例,则称为泄漏。我将继续假设你指的是一个非强引用、有界或类似的缓存,并且
Shoe
是不可变的

只需使用
static
方法返回工厂即可

public final class Shoe implements Footwear {
    private static final FootwearFactory<Shoe,Something> FACTORY =
        new FootwearFactory<Shoe,Something>() {
            ...
            public Shoe get(Something value) {
                value = new Something(value);
                ...
                return new Show(value);
            }
        };
    private static FootwearFactory<Shoe,Something> getFactory() {
        return FACTORY;
    }

    private final Something value;
    private Shoe(Something value) {
        this.value = value;
    }
    ...
}
public final class鞋履{
私人静电鞋厂=
新鞋厂(){
...
公共鞋获得(有价值的东西){
价值=新事物(价值);
...
返回新的显示(值);
}
};
私有静态鞋帽工厂getFactory(){
返回工厂;
}
私人最终价值;
私家鞋(有价值的东西){
这个值=值;
}
...
}

如果希望产品是工厂的嵌套类,还可以将CShoe设置为内部类(而不是静态类)。通过这样做,您还可以防止其他人在没有CFactory实例的情况下创建CShoe实例。如果您的示例能够运行,反射始终能够使用setAccessible()方法避开访问控制修饰符。您可以通过运行不允许“suppressAccessChecks”权限的SecurityManager来停止此操作,请参见HUMM,工厂就是这样工作的。我一直都错了。。。所以,工厂应该属于产品。。。美好的“归属”这个词有点强。但是构造函数是类的一部分,所以在简单的情况下,也应该使用“虚拟构造函数”也不是不合理的。
public final class Shoe implements Footwear {
    private static final FootwearFactory<Shoe,Something> FACTORY =
        new FootwearFactory<Shoe,Something>() {
            ...
            public Shoe get(Something value) {
                value = new Something(value);
                ...
                return new Show(value);
            }
        };
    private static FootwearFactory<Shoe,Something> getFactory() {
        return FACTORY;
    }

    private final Something value;
    private Shoe(Something value) {
        this.value = value;
    }
    ...
}