我有一个隐藏在句柄体成语背后的抽象工厂模式,如下所示:
FactoryHandle <>--------------- AbstractFactory
{+ createCommonThing() } /|\ {+ createCommonThing() }
|
| <<inherits>>
------------------------
| |
ConcreteFactory1 ConcreteFactory2
{ {
+ createCommonThing() + createCommonThing()
+ createFactory1Thing() + createFactory2Thing()
} }
这里 FactoryHandle 在构造时注入 ConcreteFactory (正文)。它只能公开 createCommonThing()方法,因为它可以是抽象基础工厂类中唯一存在而不违反Liskov Substitutability原则的方法。
我的问题是:如何干净地公开Concrete Factory特定方法,例如 createFactory1Thing 和 createFactory2Thing ?
我是否应该有一个单独的句柄类,例如 Factory1SpecificHandle ,它由 ConcreteFactory1 组成,并且只公开factory1特定的方法,如 createFactory1Thing() ?为 Factory2SpecificHandle 做同样的事情?因此,如果仅使用常用方法,则客户端使用 FactoryHandle ;如果要使用特定方法,则使用 Factory1SpecificHandle 。这有点像一个糟糕的设计。
Factory1SpecificHandle <>------------------ConcreteFactory1
{+ createFactory1Thing()} {
+ createCommonThing()
+ createFactory1Thing()
}
你认为这里干净的设计是什么意思?如果问题不清楚,请告诉我,我可以进一步详细说明。感谢。
答案 0 :(得分:1)
由于没有通用接口,我认为分离工厂更清晰(参见下面的UML图)。
每个界面(AbstractFactory1
,AbstractFActory2
)
定义了公共和特定的创建操作。
客户端使用这些接口。没有必要通过处理程序引用具体的类。
控制(限制)对工厂对象,代理的访问 (可以使用类似于Handle Body模式)(参见http://w3sdesign.com处的代理)。