在工厂模式中传递参数

时间:2016-06-14 07:10:44

标签: design-patterns domain-driven-design factory-pattern

我正在学习领域驱动设计,我现在处于'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,但在这种情况下,每个工厂都会创建一种类型的对象,而且它首先错过了使用工厂的全部要点。关于如何做到这一点的任何指示都会很棒。

2 个答案:

答案 0 :(得分:2)

工厂最有用的是抽象出复杂的创建过程,或者将客户端代码与具体意义上的具体实现分离。

这里我假设您可能实现了从表示层调用的通用createCompany(String type, Map<String, String> info)应用程序服务方法,因此您必须动态地基于类型实例化正确的具体公司。

虽然我同意这个用例会从工厂中受益,但也许您可以通过在应用程序服务上定义显式createPublicCompanycreatePrivateCompany方法来使流程更直接,并将其留给演示文稿要调用正确的图层。因此,您可以将决策向上推,无论如何必须首先进行决策(例如,显示正确的字段),您将不再需要工厂。

如果由于某些原因这不可行,并且您仍然需要从Type动态选择具体实施,那么您的工厂合同必须足够抽象以适应所有公司类型。

如果您在应用程序级别实现了通用createCompany方法,那么您之前就已经解决了这个问题。

答案 1 :(得分:0)

  

我尝试将它用于我的应用程序,在其中一个场景中它似乎不对,我不知道如何继续

我认为问题的一部分是你拥有的模型;例如,私营公司可以拥有股份,区别在于它们是在内部交易,而不是公开交易。

  • 例如,您可以通过调整模型来解决问题,使numOfShares不是原始的,而是适当的VO,表示公共和私有共享的数量,并由具体的构造函数适当地使用

  • 您可以采取这样的方法:由于公司必须交易的股票数量可以改变,因此股票的设置不需要是不变的操作,并且可以是单独的方法(如果在你的情况,你不关心私人持有的公司股票,这种方法可能只存在于具体的PublicCompany实现上)

  • 或者,您可以重新考虑模型,并将股票视为一流的概念(即合适的聚合根),因此它们不仅仅是公司的子属性,而是以其自身的权利存在,引用持有它们的实体(公共或私人)

最后,它将取决于您对域的建模方式,而后者又取决于您尝试解决的问题;在大多数情况下,当您遇到无法满足单个工厂要求的情况时,这是一个好的迹象,表明您正在处理单独的域概念,需要重新考虑模型或使用不止一家工厂。