Language agnostic 有些人怀疑工厂是做什么的

Language agnostic 有些人怀疑工厂是做什么的,language-agnostic,oop,factory,factory-pattern,Language Agnostic,Oop,Factory,Factory Pattern,我不确定是否完全理解工厂模式 假设我有一个类Customer,它基本上有以下方法: CreateCustomer-静态,从头创建客户并将其添加到数据库 LoadCustomer-静态,从数据库加载Customer的实例 KillCustomer-非静态,从数据库中删除客户 如果我理解得好的话 LoadCustomer是一个很好的工厂类候选对象 那么CreateCustomer呢?我想,它可能被放入工厂类中。是这样吗?如果不是,静态CreateCustomer方法将更改数据库状态,然后调用Cu

我不确定是否完全理解工厂模式

假设我有一个类
Customer
,它基本上有以下方法:

  • CreateCustomer
    -静态,从头创建客户并将其添加到数据库
  • LoadCustomer
    -静态,从数据库加载
    Customer
    的实例
  • KillCustomer
    -静态,从数据库中删除客户
如果我理解得好的话

  • LoadCustomer
    是一个很好的工厂类候选对象
  • 那么
    CreateCustomer
    呢?我想,它可能被放入工厂类中。是这样吗?如果不是,静态
    CreateCustomer
    方法将更改数据库状态,然后调用
    CustomerFactory.LoadCustomer
    。嗯,这是一个糟糕的设计:一个给定的对象不必知道任何关于她自己工厂的事情
  • KillCustomer
    在我看来对于工厂来说是一个非常糟糕的候选者:它作用于已经创建的对象,而不是创建对象。另一方面:
    • 如果非静态方法从数据库中删除客户,则对象(从中调用
      KillCustomer
      )仍然存在。看到一个对象在数据库级别自杀,但仍然在业务级别上,这是非常奇怪的。在这个级别上,从工厂调用
      KillCustomer
      更合理。例如,如果对象缓存在应用程序中,工厂可能会将其从数据库和缓存中删除
    • 将创建对象的方法和删除对象的方法放在不同的类中似乎也很奇怪为什么工厂只能建造一些东西,而从不破坏已经建造的东西?
  • 最后但并非最不重要的一点是,假设客户缓存在应用程序中谁负责管理缓存?在我看来,工厂必须这样做:它创建对象,因此选择是否必须加载具有从数据库填充的属性的新对象,或者该对象是否已存在于缓存中是一个很好的选择


    那么,我对工厂模式的看法是对的还是错的呢?

    工厂不是用来建造东西的。当你不知道要建造什么的时候,它是用来建造东西的。在我看来,你所有的方法都不适合工厂

    现在,如果在继承层次结构中有一大堆不同类型的客户,这些客户植根于
    Customer
    ,并且关于用于创建客户的数据的一些细节决定了创建哪种类型的客户,那么
    CreateCustomer
    将是工厂方法的最佳选择。与
    LoadCustomer
    相同,因为您可能无法完全确定数据库中存储的是哪种类型的客户


    但是,
    KillCustomer
    仍然是一个糟糕的候选人。这是因为它应该只是一个虚拟方法。然后,它就可以准确地知道调用了哪种客户。

    关于“在数据库级别自杀,但仍保持在业务级别”这一主题,您是对的,这可能会导致错误,特别是如果您没有清除对象缓存。但是这些错误可能会发生,不管你是否有工厂,因为问题是你做了一些破坏性的事情,而你的程序的其他部分,粗略地说,持有一个引用。这是一个共享数据问题(程序的两个部分共享一个对象,或者两个对象共享数据库中的一个条目)。这些对象最初是如何创建的,这不是问题。@Steve Jessop:是的,你说得对。我没想过。为什么会成为社区维基?@Omnifarious:因为我不确定我的问题是否只有一个答案。当你在社区维基上做某件事时,当某件事被投票通过时,没有人会得到任何声誉提升。它使人们不敢回答。