【问题标题】:Abstract factory design pattern with default implementation具有默认实现的抽象工厂设计模式
【发布时间】:2013-01-21 08:36:28
【问题描述】:

我必须根据客户类型创建对象系列。 我有一个基本抽象类 ApplicationRulesFactory,它定义 虚拟接口。很多具体的客户类都继承自这个类。

问题在于,对于某些客户说 CustomerB,我们不使用对象 Rule2 和 Rule3,因为应用程序中使用这些对象 Rule2 和 Rule3 的功能在该客户的应用程序用户界面中被禁用,所以我们没有真的需要实例化这些对象。

简化的代码在这里,即实际上 ApplicationRulesFactory 有更多的虚拟方法,以及从它继承的更具体的客户类:

class ApplicationRulesFactory
{
  virtual Rule1*  GetRule1() = 0;
  virtual Rule2*  GetRule2() = 0;
  virtual Rule3*  GetRule3() = 0;   
  .....
};

class ACustomerRulesFactory : public ApplicationRulesFactory
{
   Rule1* GetRule1()
   {
     return new ACustomerRule1();
   }

  Rule2 * GetRule2()
  {
    return new ACustomerRule2();
  }  

 Rule3* GetRule3()
 {
   return new ACustomerRule3();
 }  
};  

class BCustomerRulesFactory : public ApplicationRulesFactory
{
    Rule1* GetRule1()
    {
      return new BCustomerRule1();
    }
    Rule2* GetRule2() // not needed
    {
      // what to return here ?
    }  
    Rule3* GetRule3() // not needed
    {
     // what to return here ?
    }
};

那么我应该如何去实现这个:

1) 在基类 ApplicationRulesFactory 中返回一些默认实现:

class ApplicationRulesFactory
{
  virtual Rule1*  GetRule1() = 0;
  virtual Rule2*  GetRule2()  { return new Rule2DefaultImpl();}
  virtual Rule3*  GetRule3()  { return new Rule3DefaultIml();}   
};

但这似乎是错误的,从 Rule1、Rule2 继承新类(Rule1DefaultImpl,Rule2DefaultImpl),并可能使它们具有空实现,只是为了像 ApplicationRulesFactory 中的默认实现一样返回它们

2) 或在具体类中返回默认实现并将这些方法保留在基类中纯虚拟

class BCustomerRulesFactory : public ApplicationRulesFactory
{
  Rule1* GetRule1()
  {
     return new BCustomerRule1();
  }

  Rule2* GetRule2() 
  {
    return new Rule2DefaultImpl();
  }

 Rule3* GetRule3() 
 {
    return new Rule3DefaultImpl();
 }
};

这些解决方案似乎也很难重新定义每个具体客户类中的方法,尽管它们不是必需的。

3) 另外我有一种感觉,也许我不应该像这样使用继承,因为这违反了继承的 IS-A 规则,导致大量方法不适用于所有具体的客户类,但是不要在没有继承的情况下如何去实现它。

任何想法

【问题讨论】:

  • 它们是指针,你不能只返回NULL吗?设计方面,客户 A 和 B 是不同类型的客户,因此可能应该有 2 个子类,一个有 1 个规则,另一个有 3 个。
  • 是的,我可以,但仍然怀疑这是正确的做法。

标签: c++ design-patterns abstract-class


【解决方案1】:

如果ApplicationRulesFactory 对某些类型的Customers 没有意义,那么它不适合您。

您的域 knows 有什么意义,那么为什么要请求 Rule2Rule3

让知道它只需要Rule1 的对象使用一个只给它Rule1 的工厂。给它一个上下文,这样它就可以得到它需要的工厂。

【讨论】:

    【解决方案2】:

    您似乎将界面和工厂合二为一。当然,接口本身应该是一个类,具有各种规则,这些规则在基类中具有默认行为,然后在派生类中具有覆盖行为,然后工厂返回一个指向实现正确规则的请求类的指针对于那种情况。

    但也许我误解了你想要实现的目标......

    【讨论】:

    • 对不起,我没听懂,你的意思是把界面和工厂合二为一。
    • 一个典型的工厂函数是从多个类中返回一个对象的东西[这些类与相同的基类相关并且提供相同的接口]。你给它一个“选择标准”,它就会选择正确的类来创建。返回的对象表示所选类型的实现 - 例如“适用于本案的规则”。因此,在这种情况下,您将输入“客户类型”,并在一个对象中取回适用于该客户的规则。但我仍然不能 100% 确定我理解您实际想要做什么。
    【解决方案3】:

    如果这些规则永远无法使用,我建议只从基类实现中返回一个空指针(大多数情况下就像您的选项之一,除了因为它永远不能被调用而甚至不打扰默认实现)。

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多