在工厂模式中传递参数

Passing arguments in a 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,但在那种情况下,每个工厂都会创建一种类型的对象,恕我直言,它首先错过了使用工厂的全部要点。任何有关如何执行此操作的指示都会很棒。

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

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

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

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

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

I tried using it for my application and in one of the scenarios it just doesn't seem right and I dont know how to proceed

我认为部分问题在于您的模型;例如,私人公司可以持有股票,区别在于它们是在内部交易,而不是publicly。

  • 例如,您可以通过调整模型来解决问题,使 numOfShares 不是原始的而是适当的 VO,代表 Public 和私人股份的数量,并由具体的构造函数适当地使用。

  • 你可以采取这样的方法,因为公司必须交易的股票数量可以改变,股票的设置不需要是一个不变的操作,可以是一个单独的方法(如果在你的情况下,你不关心私人持有的公司股份,这种方法可能只存在于具体的Public公司实施中)

  • 或者,您可以重新考虑模型并将共享视为第一个 class 概念(即适当的聚合根),它们不仅仅是子 属性 属于一家公司,但独立存在,并提及持有它们的实体(public 或私人)

最后,这将取决于您如何为域建模,而这又取决于您要解决的问题;在大多数情况下,当您 运行 遇到似乎无法通过单个工厂完全满足您的要求的情况时,这是一个好兆头,表明您正在处理单独的域概念并且需要重新考虑型号或使用多个工厂。