我正在学习领域驱动设计,我现在处于'naively confident'阶段。 DDD(蓝皮书)谈到了建立聚合体的工厂模式。我尝试将它用于我的应用程序,并且在其中一个场景中它看起来不对,我不知道如何继续。以下是我的情况:
class CompanyFactory {
public Company getCompany(Type type, Long numOfShares) {
switch(type) {
case PUBLIC:
return new PublicCompany(numOfShares);
case PRIVATE:
return new PrivateCompany();
}
}
现在,参数'numOfShares'
仅与PublicCompany
相关。但是当我的类型为'PRIVATE'
时,我仍然必须发送'numOfShares'
,即使它不会被使用。
我尝试过AbstractFactory,但在这种情况下,每个工厂都会创建一种类型的对象,而且它首先错过了使用工厂的全部要点。关于如何做到这一点的任何指示都会很棒。
答案 0 :(得分:2)
工厂最有用的是抽象出复杂的创建过程,或者将客户端代码与具体意义上的具体实现分离。
这里我假设您可能实现了从表示层调用的通用createCompany(String type, Map<String, String> info)
应用程序服务方法,因此您必须动态地基于类型实例化正确的具体公司。
虽然我同意这个用例会从工厂中受益,但也许您可以通过在应用程序服务上定义显式createPublicCompany
和createPrivateCompany
方法来使流程更直接,并将其留给演示文稿要调用正确的图层。因此,您可以将决策向上推,无论如何必须首先进行决策(例如,显示正确的字段),您将不再需要工厂。
如果由于某些原因这不可行,并且您仍然需要从Type
动态选择具体实施,那么您的工厂合同必须足够抽象以适应所有公司类型。
如果您在应用程序级别实现了通用createCompany
方法,那么您之前就已经解决了这个问题。
答案 1 :(得分:0)
我尝试将它用于我的应用程序,在其中一个场景中它似乎不对,我不知道如何继续
我认为问题的一部分是你拥有的模型;例如,私营公司可以拥有股份,区别在于它们是在内部交易,而不是公开交易。
例如,您可以通过调整模型来解决问题,使numOfShares
不是原始的,而是适当的VO,表示公共和私有共享的数量,并由具体的构造函数适当地使用
您可以采取这样的方法:由于公司必须交易的股票数量可以改变,因此股票的设置不需要是不变的操作,并且可以是单独的方法(如果在你的情况,你不关心私人持有的公司股票,这种方法可能只存在于具体的PublicCompany实现上)
或者,您可以重新考虑模型,并将股票视为一流的概念(即合适的聚合根),因此它们不仅仅是公司的子属性,而是以其自身的权利存在,引用持有它们的实体(公共或私人)
最后,它将取决于您对域的建模方式,而后者又取决于您尝试解决的问题;在大多数情况下,当您遇到无法满足单个工厂要求的情况时,这是一个好的迹象,表明您正在处理单独的域概念,需要重新考虑模型或使用不止一家工厂。