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