繁体   English   中英

通过简单工厂使用策略模式

[英]Using strategy pattern with simple factory

我一直在学习设计模式,我认为我有点坚持不进行任何答题的练习。

我已经使用了策略模式来创建它: http ://i.imgur.com/5Lia4JD.png(减去duck中的setBehavior函数)

我需要通过简单的工厂来改进此设计,因为目前,这两种行为是通过以下代码实例化的(通过示例显示):

    public MallardDuck()
    { 
    setQuackBehavior(new Quack());
    setFlyBehavior(new FlyWithWings());
    }

这是不正确的,因为我们需要编程为接口而不是实现。

我想做的是制造两个分别处理特定行为的独立工厂,但是当我进行设计时,我开始怀疑我的解决方案。 用简单的工厂做这种事情正常吗?

有人可以朝正确的方向推动我吗? :]

如果要避免具体策略与其宿主之间的强耦合,您可以依赖一家工厂,该工厂知道如何为给定类型评估者使用正确的策略实例化Duck,而不是每个类型都具有具体的类。

以上设计可能更具可测试性,但我认为您不应该太在意混凝土鸭子与它们所使用的具体策略之间的耦合。

这是不正确的,因为我们需要编程为接口而不是实现。

您可以对接口进行编程,因为setQuackBehavior()将接口作为输入,并且您的庸医类将庸医行为字段表示为接口而不是实现。 一次,在代码中,使用实现类是正常的。 在很多情况下,使用带有返回基于接口实例的方法的工厂很有用,但是在您的情况下,我看不出有兴趣。 为什么您的庸医子类不应该知道所使用的具体行为? 如果没有理由,那么看起来还可以:

setQuackBehavior(new Quack());

使用没有附加值的工厂会给出没有原因的复杂代码。

如果您正在编程Ducks,那么无论如何这都是一个玩具示例。 继续进行两个独立的简单工厂。 一般规则是每个接口都有一个简单的工厂。 您可以将所有简单的工厂归为一类,以使其不那么复杂。

具体类实例化其他具体类的缺点当然是与实现的风险耦合。 如果实现细节发生更改(是的,新的内容很简单,但是整个鸭子的例子都是微不足道的),那么知道信息的类也可能会更改。

没错,它不是在为接口编程。 对实现细节了解较少的类与这些细节的更改更隔离,这就是使用接口的全部要点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM