在抽象工厂模式中,涉及的主要实体是
我已经在各种实现中看到并观察到客户端代码知道具体工厂。 根据我在不同地方看到的模式的通用定义如下
定义用于创建对象的接口,但让子类决定实例化哪个类。
根据我的观察,createProduct
在抽象工厂方法中被实现为抽象方法。它公开了一个非抽象的公共方法,如getProduct
,它调用createProduct
方法。根据具体的运行时对象,相应地调用工厂类createProduct
。
即使基本抽象工厂类不存在,客户端代码也可以简单地调用具体工厂类对象上的createProduct
方法,因为客户端代码可以看到具体的工厂类。
我觉得抽象基类只适用于以下情况
如果我们有代码来创建具体Factory类的对象,则与在这些对象上调用getProduct
方法的代码分开。实例化concrete Factory classes
的代码可以
将工厂放在某个队列中,以后可以迭代队列
可以获得Concrete products
。
请提供宝贵的意见。
答案 0 :(得分:2)
客户不应该了解任何具体的工厂。抽象工厂应该隐藏工厂实现细节,允许不同的工厂进行交换而不影响客户端。
表明AbstractFactory模式的目的是生产混凝土工厂的答案是完全错误的。不幸的是,这种错误信息看似直观,因此不正确的定义在SO上猖獗,许多人都有数百个赞成票。
答案here给出了一个很好的解释AbstractFactory;但要注意表明重复的评论。链接线程中的答案将破坏对模式的任何理解。
答案 1 :(得分:2)
抽象工厂不必是抽象类,大多数时候它只是一个接口。
使用的混凝土工厂应注入DI。这样,工厂的消费者就不知道使用哪一个。