
是一个简单的抽象工厂。我知道抽象工厂是用来选择一个产品系列的。但我的问题是,如果ConcreteFactory1需要createProductC(),但ConcreteFactory2不需要,那么我们还能使用这种模式吗?如果我们不能使用,我们如何解决这个问题?
发布于 2017-11-01 01:27:22
如果ConcreteFactory1需要createProductC(),但ConcreteFactory2不需要,那么我们仍然可以使用这种模式吗?
是。是的你可以。
当您查看某些客户端代码时,理解此模式要简单得多。
class Client {
private AbstractFactory af;
public client(AbstractFactory af) { this.af = af; }
public toString() {
return String.format("%s %s %s",
af.createProductA(),
af.createProductB(),
af.createProductC());
}
} 这可能会让你打印
ProductA1 ProductB1 ProductC1
或者它可以让你打印
ProductA2 ProductB2
我们怎么才能得到那点魔法呢?空对象模式的空对象模式!我最喜欢的实现是空字符串:"“
仅仅因为一个对象的存在并不意味着它必须做任何事情。当您遵循null对象模式时,您提供了所需的接口,但是调用这些方法没有什么作用。因此,即使客户机要求更多的这些产品,那么仅仅是它们的toString()方法,空对象模式在询问时也会悄无声息地无所事事。
这在很大程度上取决于客户端的编写方式。你会注意到我们还剩下一个后腿的地方。但我们不必测试我们拥有的抽象工厂。这对于保持面向对象至关重要。
空对象可以像客户端所需要的那样复杂。基本的模式是让它安全但毫无意义地点缀它。也不例外。返回void的方法干脆什么也不做。没有副作用。返回字符串的方法返回空字符串。返回数字的方法返回0或1,具体取决于客户端是否要添加或乘。返回集合的方法返回空集合。即使是monads也可以返回,如果这是客户所期望的,只要他们最终什么也不做,静静地。
发布于 2017-10-31 22:29:45
如果ConcreteFactory1需要createProductC(),但ConcreteFactory2不需要,那么我们仍然可以使用这种模式吗?
您在这里有一些设计选项:
C's创建一个单独的抽象工厂。按照产品划分抽象工厂接口通常是有用的,与CreateProductA和CreateProductB在同一个接口中的组合不同。如果产品C与其他产品没有太多共同之处,我认为这是正确的选择。createProductC保存在同一个抽象工厂中,但将其签名更改为返回ProductC或nothing (在Java中这将是Option[ProductC])。这将强制客户端处理一些具体工厂不生产产品的事实。我认为,如果C产品与A和B产品密切相关,而C的生产确实是可选的,那么这是正确的选择,而且客户只有在工厂有货的情况下才应该这样做。发布于 2017-11-01 13:42:32
您的图表只显示了一个客户端,所以它要么需要createProductC,要么不需要,如果需要它,不能提供C的工厂就不能使用。
如果您有多个客户,有些需要Cs,有些不需要,您可能需要多种类型的工厂。
interface ABFactory {
A createA();
B createB();
}
interface ABCFactory {
A createA();
B createB();
C createC();
}然后每个混凝土工厂都可以实现一堆接口。
class Factory1 implements ABFactory, ABCFactory { ... }
class Factory2 implements ABFactory { ... }每个客户都可以要求它所需要的
// can only use Factory1
class Client1 {
private ABCFactory af;
public client(ABCFactory af) { this.af = af; }
public void doStuff() {
A a = af.createProductA();
B b = af.createProductB();
C c = af.createProductC();
}
}
// can use both Factory1 and Factory2
class Client2 {
private ABFactory af;
public client(ABFactory af) { this.af = af; }
public void doStuff() {
A a = af.createProductA();
B b = af.createProductB();
}
} https://softwareengineering.stackexchange.com/questions/360042
复制相似问题