首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象工厂配置差异

抽象工厂配置差异
EN

Software Engineering用户
提问于 2017-10-31 22:14:02
回答 3查看 462关注 0票数 2

是一个简单的抽象工厂。我知道抽象工厂是用来选择一个产品系列的。但我的问题是,如果ConcreteFactory1需要createProductC(),但ConcreteFactory2不需要,那么我们还能使用这种模式吗?如果我们不能使用,我们如何解决这个问题?

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2017-11-01 01:27:22

如果ConcreteFactory1需要createProductC(),但ConcreteFactory2不需要,那么我们仍然可以使用这种模式吗?

是。是的你可以。

当您查看某些客户端代码时,理解此模式要简单得多。

代码语言:javascript
复制
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也可以返回,如果这是客户所期望的,只要他们最终什么也不做,静静地。

票数 2
EN

Software Engineering用户

发布于 2017-10-31 22:29:45

如果ConcreteFactory1需要createProductC(),但ConcreteFactory2不需要,那么我们仍然可以使用这种模式吗?

您在这里有一些设计选项:

  1. 为创建C's创建一个单独的抽象工厂。按照产品划分抽象工厂接口通常是有用的,与CreateProductACreateProductB在同一个接口中的组合不同。如果产品C与其他产品没有太多共同之处,我认为这是正确的选择。
  2. createProductC保存在同一个抽象工厂中,但将其签名更改为返回ProductC或nothing (在Java中这将是Option[ProductC])。这将强制客户端处理一些具体工厂不生产产品的事实。我认为,如果C产品与A和B产品密切相关,而C的生产确实是可选的,那么这是正确的选择,而且客户只有在工厂有货的情况下才应该这样做。
票数 2
EN

Software Engineering用户

发布于 2017-11-01 13:42:32

您的图表只显示了一个客户端,所以它要么需要createProductC,要么不需要,如果需要它,不能提供C的工厂就不能使用。

如果您有多个客户,有些需要Cs,有些不需要,您可能需要多种类型的工厂。

代码语言:javascript
复制
interface ABFactory {
    A createA();
    B createB();
}

interface ABCFactory {
    A createA();
    B createB();
    C createC();
}

然后每个混凝土工厂都可以实现一堆接口。

代码语言:javascript
复制
 class Factory1 implements ABFactory, ABCFactory { ... }
 class Factory2 implements ABFactory { ... }

每个客户都可以要求它所需要的

代码语言:javascript
复制
// 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();
    } 
} 
票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/360042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档