工厂模式混乱

时间:2012-06-05 20:56:35

标签: c# java .net oop design-patterns

当客户端应用程序请求新对象时, 我让Factory类为我创建了这个新对象。

public class CarFactory{

    public Car CreateCar()
    {
       //create a new car object and send back  
    }
}

通过调用存储在数据库中的存储过程来填充car对象的属性。在数据库中,我们存储可以每天更改的默认值。默认表由外部系统填充。

public class Car {
  public List<string> DefaultTyres {get;set;}
  public List<string> DefaultPetrolSpec {get;set;} 
}

因此,当工厂(服务层调用)创建Car对象时,工厂类调用存储库类,然后调用DB来填充Car的属性......但这些层的关系听起来有点奇怪。

public Car CreateCar()
{
    //create a new car object and send back
    //Call CarRepository.GetDefaultTyres(), CarRepository.GetDefaultPetrolSpec() etc.  
}

因为我认为我的工厂实施工作做得很多。也许它不应该调用存储库层(然后调用数据库来获取汽车对象的数据)。

你们觉得怎么样?工厂类应该与DB通信吗?他们这样做好吗?如果没有,那么它的责任应该是什么?

3 个答案:

答案 0 :(得分:0)

如果你有一个额外的类来处理实际的数据库连接,我认为这很好。这个类的意思是执行实际连接,处理一些连接/查询异常等.Cool类不应该知道与DB相关的东西,它应该委托到另一个类/对象

这个DB的抽象层也可以是一个完整的层次结构树,而不仅仅是一个类。像这样:

enter image description here

每个子类都知道如何处理与特定RDBMS的连接。

PS:请注意,这只是一个例子,您可能不必像这样做。此外,拥有这样的层次结构可能会使事情变得复杂,因为您可能也需要这些类的工厂。

答案 1 :(得分:0)

答案取决于是否可能存在多个(实施)存储库或多个数据库/其他数据存储。如果上面的答案是肯定的(即使这只是预期的需求/可能性),最好有一个存储库层,以便在/如果发生这些变化时将Factory类与上述变化隔离开来。 / p>

以不同的方式思考: 是工厂阶级知道如何制造汽车的责任; 有责任知道连接到/何时/如何连接数据库。通常,kepp职责更容易促进变革和模块化设计

答案 2 :(得分:0)

随着时间的推移,我学到的一件事就是你的问题可能有5个答案。并且,所有这些都是正确的。真正的问题是:你在做什么才有意义?如果您的工厂位于服务器上并且与数据库的连接最接近,那么这就是调用的位置。

现在我有时会问自己同样的问题以及其他问题。例如,工厂应该在制造汽车时为汽车制造轮胎和汽油,还是汽车应该是知道如何创造自己的汽车。

所以你可能想要考虑这个问题:如果你的工厂正在创建大量的对象(这通常是你有工厂模式的原因),那么你的所有元素都有一个基类可能是有道理的暴露Create方法的接口。 (我发布了一个非常快速和肮脏的例子,做反射创建类型可以使工厂更加通用)

示例:

   public interface FactoryObject
   {
          void Create();
          void Destroy();
   }

   public class Car:FactoryObject
   {
        public void Create()
        {
             //TODO: Create my tyres and my petrol
             //TODO: Create my fenders and body
        }
   }

   public class Bicycle:FactoryObject
   {
        public void Create()
        {
             //TODO: Create my tyres but I do not need petrol
             //TODO: Create my fenders but I have no body
        }
   }

   public class Factory
   {
        public FactoryObject GetFactoryObject(Type type)
        {
             FactoryObject returnedObject = null;
             if ( type is Car ) returnedObject = new Car();
             elseif (type is Bicycle) returnedObject = new Bicycle();
             if (returnedObject != null)
                  returnedObject.Create();
             return returnedObject;
        }       
   }

以这种方式,您的工厂知道要创建一个FactoryObject,但是它不知道如何构建该对象。更重要的是,它并不关心。