首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂模式混淆

工厂模式混淆
EN

Stack Overflow用户
提问于 2012-06-06 04:56:35
回答 3查看 269关注 0票数 2

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

代码语言:javascript
复制
public class CarFactory{

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

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

代码语言:javascript
复制
public class Car {
  public List<string> DefaultTyres {get;set;}
  public List<string> DefaultPetrolSpec {get;set;} 
}

因此,当工厂(服务层调用)创建汽车对象时,工厂类调用repository类,然后调用DB来填充汽车的properties...but。这些层的关系听起来有点奇怪……

代码语言:javascript
复制
public Car CreateCar()
{
    //create a new car object and send back
    //Call CarRepository.GetDefaultTyres(), CarRepository.GetDefaultPetrolSpec() etc.  
}

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

你们觉得怎么样?工厂类应该与DB通信吗?如果他们这样做了,可以吗?如果不是,那该由谁负责呢?

EN

回答 3

Stack Overflow用户

发布于 2012-06-06 05:02:15

如果您有一个额外的类来处理实际的DB连接,我认为这是很好的。我所说的这样的类是执行实际连接的类,处理一些连接/查询异常等。工厂类不应该知道与数据库相关的东西,它应该将委托给另一个类/对象。

DB的这个抽象层也可以是一个完整的类层次树,而不仅仅是一个类。如下所示:

这些子类中的每一个都知道如何处理到特定RDBMS的连接。

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

票数 0
EN

Stack Overflow用户

发布于 2012-06-06 05:05:50

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

换个角度看:知道如何创建汽车是工厂类的责任;知道连接到什么数据库/何时连接/如何连接不是它的责任。通常情况下,保持职责简单化变更和模块化设计是更好的。

票数 0
EN

Stack Overflow用户

发布于 2012-06-06 05:22:31

随着时间的推移,我学到的一件事是,你的问题可能有5个答案。而且,他们都是对的。真正的问题是:你正在做的事情有意义吗?如果您的工厂在服务器上,并且与数据库的连接离服务器最近,那么调用就应该在服务器上。

现在,我有时会问自己和别人一样的问题。例如,在制造汽车时,工厂是否应该为汽车制造轮胎和汽油,或者汽车应该是知道如何创造自己的人。

因此,您可能需要考虑这一点:如果您的工厂正在创建大量对象(这通常就是您拥有工厂模式的原因),那么所有元素都有一个公开Create方法的基类/接口可能是有意义的。(我发布了一个非常快速和肮脏的示例,使用反射来创建类型可以使工厂更加通用)

示例:

代码语言:javascript
复制
   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,但是它不知道如何构建该对象。更重要的是,它并不关心。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10904822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档