【问题标题】:OOD: Using factory pattern in combination with strategy patternOOD:将工厂模式与策略模式结合使用
【发布时间】:2013-04-30 05:34:07
【问题描述】:

Stackoverflow 上已经有一些类似场景的问题,但它们并没有真正解决我的情况。 我目前正在做一些重构,并希望通过应用模式使代码更加健壮、灵活和可读。这是任务:

我有一个类,比如说 A 类,它在设置其中一个成员时应用了一些逻辑。这个逻辑很容易改变,所以我想把它外化。这就是策略模式有用的地方。 此外,在某个阶段,我需要过滤 A 类对象的列表。过滤逻辑也应该是可配置的,因此在这个任务中,stratey 模式也很方便。 问题是:如何将这些要求结合到面向对象的设计中?

到目前为止我的想法: - 为类型 A 的对象使用工厂,它有两个策略对象:SettingMemberStrategy 和 FilterStrategy。如果具体工厂实现为单例,则需要在创建对象之前指定两个策略对象。 - 在A类的接口上有两个方法:setMember(value);布尔过滤()。这些方法的确切实施由策略决定。但是,对象是否也应该携带策略的实例?

这种方法可能会奏效,但对于这项任务来说似乎有点过度设计,而且在美学上也不太讨人喜欢。 有人可以暗示更好的解决方案吗? 太感谢了。

干杯,

马丁

public interface IA {
   setMember(); 
   filter();
}

public class A implements IA {
   private String theMember = "";

   getMember() { return this.theMember; }
   setMember(String input, otherParameters[]) {  
      // set value for member based on strategy and parameters
   }        

   boolean filter(); 
   // returns yes/no based on whether this class should be filtered 
   // as per filter strategy
}


public class myFactory {
    private FilterStrategy  myFilterStrategy; 
    private MemberStrategy  mySetMemberStrategy; 

    IA createObjectOfClassA() {
        a = new A(mySetMemberStrategy, myFilterStrategy);
    }

    setFilterStrategy(FilterStrategy s) { this.myFilterStrategy = s }

    setMemberStrategy(MemberStrategy s) { this.mySetMemberStrategy = s }
}

【问题讨论】:

  • 如果对象(A 的实例)没有对策略的引用,它如何调用策略来应用?你能提供一些代码吗?
  • 好的,我可以尝试创建一些虚拟代码。

标签: oop design-patterns factory strategy-pattern


【解决方案1】:

这个问题完全取决于您如何使用这些对象。我的直觉告诉我,在大多数情况下,您不需要同时使用工厂模式和策略模式——您可能希望选择其中一个,从而简化您的代码。

例如,如果您在工厂中创建对象 A 的子类,则消除可配置策略并将其烘焙到您的子类中。

但是,如果您不创建子类,只创建具有可配置策略的对象,则消除工厂,并在需要时在其构造函数中创建具有适当策略的对象。

如果您例如根据输入创建对象并使用工厂方法为您提供适当的实例,也可以将两者结合起来,即

public A MyFactoryMethod(string typeToCreate){
      switch(typeToCreate) {
           case "AbeforeB":
               return new A(new FilterStrategyA(), new MemberStragegyB());
           case "allA":
               return new A(new FilterA(), new MemberStrategyA());  
           // etc. etc.        
       }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2016-12-13
    相关资源
    最近更新 更多