当客户端应用程序请求新对象时,我让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;}
}因此,当工厂(服务层调用)创建汽车对象时,工厂类调用repository类,然后调用DB来填充汽车的properties...but。这些层的关系听起来有点奇怪……
public Car CreateCar()
{
//create a new car object and send back
//Call CarRepository.GetDefaultTyres(), CarRepository.GetDefaultPetrolSpec() etc.
}因为我认为我的工厂实现做了很多事情。也许它不应该调用存储库层(然后调用DB来获取汽车对象的数据)。
你们觉得怎么样?工厂类应该与DB通信吗?如果他们这样做了,可以吗?如果不是,那该由谁负责呢?
发布于 2012-06-06 05:02:15
如果您有一个额外的类来处理实际的DB连接,我认为这是很好的。我所说的这样的类是执行实际连接的类,处理一些连接/查询异常等。工厂类不应该知道与数据库相关的东西,它应该将委托给另一个类/对象。
DB的这个抽象层也可以是一个完整的类层次树,而不仅仅是一个类。如下所示:

这些子类中的每一个都知道如何处理到特定RDBMS的连接。
注:请注意,这只是一个示例,您可能不必这样做。此外,拥有这样的层次结构可能会使事情变得有点复杂,因为您也可能需要为这些类提供一个Factory。
发布于 2012-06-06 05:05:50
答案取决于是否可能存在多个存储库(实现)或涉及多个数据库/其他数据存储。如果上面的答案是肯定的(即使这只是一个预期的需要/可能性),最好有一个存储库层,以便在发生上述更改时将Factory类与上面提到的更改隔离开来。
换个角度看:知道如何创建汽车是工厂类的责任;知道连接到什么数据库/何时连接/如何连接不是它的责任。通常情况下,保持职责简单化变更和模块化设计是更好的。
发布于 2012-06-06 05:22:31
随着时间的推移,我学到的一件事是,你的问题可能有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,但是它不知道如何构建该对象。更重要的是,它并不关心。
https://stackoverflow.com/questions/10904822
复制相似问题