Oop DDD图书,埃里克·埃文斯:“什么是”的意思;工厂应抽象为所需的类型,而不是创建的具体类;?

Oop DDD图书,埃里克·埃文斯:“什么是”的意思;工厂应抽象为所需的类型,而不是创建的具体类;?,oop,domain-driven-design,factory-pattern,Oop,Domain Driven Design,Factory Pattern,Eric Evans在《领域驱动设计》一书中的第6章“工厂”一节(第139页)中指出: “任何好工厂的两个基本要求是: "二,。工厂应抽象为所需的类型,而不是创建的具体类。” 请您详细说明一下关于基本要求2的声明是什么意思。我认为这意味着您永远不应该从工厂退回混凝土型号 例如,如果你有一个接口,比如说ISomething,一个抽象类SomethingBase,最后是一些实现这个接口并从基类继承的类。你的创建方法应该返回接口类型,而不是基类。我想这就是想法 public ISomething C

Eric Evans在《领域驱动设计》一书中的第6章“工厂”一节(第139页)中指出:

“任何好工厂的两个基本要求是:

"二,。工厂应抽象为所需的类型,而不是创建的具体类。”


请您详细说明一下关于基本要求2的声明是什么意思。

我认为这意味着您永远不应该从工厂退回混凝土型号

例如,如果你有一个接口,比如说
ISomething
,一个抽象类
SomethingBase
,最后是一些实现这个接口并从基类继承的类。你的创建方法应该返回接口类型,而不是基类。我想这就是想法

public ISomething Create() { ... }
而不是

public SomethingBase Create() { ... }
我希望有帮助,
Carlos.

Carlos Loth的回答是正确的,但您也应该始终记住使用,因为这将允许您将混凝土工厂耦合到混凝土类型,而无需将消费者耦合到混凝土工厂或类型

public interface ISomethingFactory
{
    ISomething Create();
}

public class SomethingFactory : ISomethingFactory
{
    public ISomething Create()
    {
        return new Something();
    }
}

谢谢你的快速回复。虽然我仍然有点困惑,因为书的后面(第143页底部)也说:“工厂与产品的具体类别相结合;“幸运的是,我是用php开发的,因此“返回类型”在技术上不是一个太大的问题(尽管在概念上仍然很重要)我认为它是这样说的,因为在大多数情况下,您将使用新操作符在Create方法内实例化具体类。因此,您将在creational方法和具体类型之间具有强耦合。您的使用者不一定会引用具体类型,只会引用接口。但是工厂类将需要引用我想我明白了。所以,基本上利用各种创作模式(GoF)使工厂类的签名和返回类型尽可能通用,以屏蔽具体的特定实现。但是,只要接口是通用的,您仍然可以拥有绑定到具体域对象的工厂类。因此,LampshadeFactory和SofaFactory只要隐藏在FurnitureF后面,就仍然可以actory的抽象接口。