什么是将类的实例限制为一个类的最佳实践?类似于this,但使用Java。
假设有Main类,然后有User,Admin,View,Data,Client等类。只有“ Main”类应该能够实例化所有其他类。
因此,如果“用户”需要在“数据”类中调用“ getUser”方法,则无法实例化“数据”类和调用方法,但必须调用“主”类,然后“主”将实例化“ Data”类并将参数传递给其“ getUser”方法。
我正在考虑使用私有构造函数,工厂模式等,但是不确定是否会导致我需要的结果。由于复杂性,我认为内部类不是一个好的解决方案。
对此有何建议?
答案 0 :(得分:2)
在概念上有一个独特的答案(因为在技术上“如何做到”已经有了很好的答案):
假设有Main类,然后有User,Admin,View,Data,Client等类。只有“ Main”类应该能够实例化所有其他类。
我认为这不是一个好的起点。当然,当人们遵循域驱动设计时,使用factories的做法已经很成熟。
但是要添加一个微妙的要点:您仍然希望以合理的方式削减“边界”。含义:不要强迫所有对象进入单个工厂。您的对象应该以某种方式类似于它们的域,并在需要时分开。
意思是:使用工厂很好,但不要强迫自己确实存在一个一个工厂来应对各种您处理的对象。取而代之的是:尝试合理地划分对象模型,并在概念上拥有尽可能多的工厂。
还请注意,您可能应该区分主要提供数据/信息的对象和最后具有“行为”的对象。因此,值得考虑使用服务注册中心的想法(例如,您使用netflix Eureka框架进行的操作,请参见here)。
最后,在这里引用tucuxi给出的出色评论:对于小型应用程序,工厂过度设计。对于大型应用程序,我发现只有一个名为“ Main”的工厂存在问题,而不是以更传统的方式划分职责。
答案 1 :(得分:0)
您可以将子类与私有构造函数一起使用: 这样,只有InstantiatonClass可以创建InstantiatonClass.ArgClass和ProtectedClass的构造函数。
public class ProtectedClass{
//constructor that can only be invoked with an instance of ArgClass
public ProtectedClass(InstantiatonClass.ArgClass checkArg){}
}
public class InstantiatonClass{
public static class ArgClass{
//constructor that can only be invoked from InstantiatonClass
private ArgClass(){}
}
}
答案 2 :(得分:0)
您应该能够在Class的构造函数中获取调用者的类:
How to get the name of the calling class in Java?
然后在只希望由Main实例化的类中,只需检查调用方类在其构造函数中是否为Main,如果没有抛出RuntimeException的话。