我有一个工厂类CipherBuilder
,其静态方法build
返回StringCipher
对象到客户端。 我想隐藏StringCipher
类,所以客户端只能通过CipherBuilder
工厂得到这种类型的对象,并且不能直接调用类构造函数(但它仍然可以使用它的公有方法)。以工厂模式隐藏客户端的产品
我当前的实现是创建另一个包从客户端代码分开,并把其中的三个班,CipherBuilder
工厂(这是公开的),在StringCipher
(包私人)和公共的接口吧(IStringCipher
)。这样客户端不能直接调用构造函数,但它仍然可以通过接口使用公共方法。
但是因为我不得不创建一个新的包来隐藏一个类,这就像一个黑客。有没有更好的方式来执行此操作(使用Java),同时将StringCipher保留在与客户端代码相同的包中,并将StringCipher
和CipherBuilder
保存在单独的文件中?
让CipherBuilder创建一个IStringCipher。并且StringCipher以某种方式被隐藏。它确实意味着一个包私人类和构造函数。子包也是惯例。人们可以使该类成为工厂类的静态内部类。 –
因此,在将StringCipher与客户端代码保持在同一个包中时,没有办法做到这一点?我可以在单独的文件中执行静态内部类吗? – devil0150
另一种方法:** Java SPI,服务提供程序接口**。这是一种机制,通过该机制可以发现并加载XML解析器。至于原始问题:我不完全确定你想要指定的东西是多么“好”。 (顺便说一下,至少有一个'package'是常态。)有一个带有私有构造函数的类(例如工厂),可以将工厂传递给构造函数并检查一个非null对象。丑陋! (更好地等待Java 9与模块。)对不起,混乱。 –