Java 在面向对象编程中获取特定类的所有对象

Java 在面向对象编程中获取特定类的所有对象,java,php,oop,design-patterns,factory-pattern,Java,Php,Oop,Design Patterns,Factory Pattern,最近我看到了一些获取所有对象的方法,我特别喜欢Factory方法,但是我看到人们在类之外使用函数,在用户对象上调用getAll方法等等 下面的示例是我最常用的从数据库获取所有用户的方法。虽然这是PHP代码,但我想看看人们如何在不同的编程语言中做到这一点 你喜欢什么?为什么?这更像是一场讨论,我希望下次我来做这件事时能给我更多的想法 class userFactory extends Factory { public function __construct(){ }

最近我看到了一些获取所有对象的方法,我特别喜欢Factory方法,但是我看到人们在类之外使用函数,在用户对象上调用getAll方法等等

下面的示例是我最常用的从数据库获取所有用户的方法。虽然这是PHP代码,但我想看看人们如何在不同的编程语言中做到这一点

你喜欢什么?为什么?这更像是一场讨论,我希望下次我来做这件事时能给我更多的想法

class userFactory extends Factory {
     public function __construct(){

     }

     public function getAllUsers() {
          $users = array();
          $result = $this->db->Execute("SELECT * FROM user");
          while (!$result->EOF) {
              $users[] = new user($result);
          }
          return $users;
     }
}

嗯,如果你只是在寻找想法,你可以考虑使用对象关系映射器(ORM)。这允许您将数据库查询的结果用作所选语言中的第一类对象。例如,如果我有一个公司和员工表,我可能可以在Ruby/Rails(使用ActiveRecord ORM)中实现这一点:

这将生成一个SQL查询,并自动创建一个一级对象系统。在前面的示例中,您可以通过使用以下类型的代码来完成此任务:

$users = UserQuery::create()=>all();

如果您使用PHP,已经有一些好的orm存在,只需谷歌“PHPROM”就可以找到它们。有一些ActualErrd克隆,以及一些更适合PHP语言的。

嗯,如果你只是在寻找想法,你可以考虑使用对象关系映射器(ORM)。这允许您将数据库查询的结果用作所选语言中的第一类对象。例如,如果我有一个公司和员工表,我可能可以在Ruby/Rails(使用ActiveRecord ORM)中实现这一点:

这将生成一个SQL查询,并自动创建一个一级对象系统。在前面的示例中,您可以通过使用以下类型的代码来完成此任务:

$users = UserQuery::create()=>all();

如果您使用PHP,已经有一些好的orm存在,只需谷歌“PHPROM”就可以找到它们。有一些ActiveRecord克隆,以及一些更适合php语言的克隆。

您已经实现了的一部分(即使它返回用户实例,也不是工厂)。 DAO通常负责查找、创建、持久化、编辑和删除同类对象

另请参见-repository是更高级别的抽象-它可以查询多个DAO以获得预期的结果,但是一个DAO应该只查询一个db表

PHP持久性框架
  • -类似Java的ORM,没有依赖项,请参阅(getter/setter应该是可选的)
  • -ActiveRecord,Kohana 3.0 web框架的一部分
  • -ActiveRecord,Zend框架的一部分
  • 其他的很少(google orm/activerecord/persistence for php)
然后,您可以定义关系并使用以下对象:

//ORM/ActiveRecord way
$user = Repo :: get ( "users" ) -> find_by_id ( $user_id );
$user = User :: find_by_id ( $user_id );

$user_payments = $user -> payments;
$user_articles = $user -> articles;
而不是:

$user_repository = Repo :: get ( "users" );
$articles_repository = Repo :: get ( "articles" );

$user = $user_repository -> find_by_id ( $user_id );
$user_articles = $articles_repository -> find_all_for ( $user );
ActiveRecord更简单,更易于使用,但它不是很OOP。方法如下:

  • $user->save()
  • $user->delete()
  • 用户::查找所有()
  • 用户::按\u id($id)查找\u
只是不应该是用户类的一部分,因为知道如何找到所有实例、如何将其存储在数据库中等都不是对象的责任。无论如何,这是一个好的开始,它迫使您考虑富域模型。所以-选择ActiveRecord,当你掌握了一些技能后,尝试切换到一些真正的ORM

其他语言
  • 对于JAVA项目,google For JPA、Hibernate、Toplink、iBatis
  • 对于Ruby,有一个ActiveRecord类
  • 如果你真的喜欢OOP,用谷歌搜索smalltalk持久性:-)

您已经实现了的一部分(即使它返回用户实例,也不是工厂)。 DAO通常负责查找、创建、持久化、编辑和删除同类对象

另请参见-repository是更高级别的抽象-它可以查询多个DAO以获得预期的结果,但是一个DAO应该只查询一个db表

PHP持久性框架
  • -类似Java的ORM,没有依赖项,请参阅(getter/setter应该是可选的)
  • -ActiveRecord,Kohana 3.0 web框架的一部分
  • -ActiveRecord,Zend框架的一部分
  • 其他的很少(google orm/activerecord/persistence for php)
然后,您可以定义关系并使用以下对象:

//ORM/ActiveRecord way
$user = Repo :: get ( "users" ) -> find_by_id ( $user_id );
$user = User :: find_by_id ( $user_id );

$user_payments = $user -> payments;
$user_articles = $user -> articles;
而不是:

$user_repository = Repo :: get ( "users" );
$articles_repository = Repo :: get ( "articles" );

$user = $user_repository -> find_by_id ( $user_id );
$user_articles = $articles_repository -> find_all_for ( $user );
ActiveRecord更简单,更易于使用,但它不是很OOP。方法如下:

  • $user->save()
  • $user->delete()
  • 用户::查找所有()
  • 用户::按\u id($id)查找\u
只是不应该是用户类的一部分,因为知道如何找到所有实例、如何将其存储在数据库中等都不是对象的责任。无论如何,这是一个好的开始,它迫使您考虑富域模型。所以-选择ActiveRecord,当你掌握了一些技能后,尝试切换到一些真正的ORM

其他语言
  • 对于JAVA项目,google For JPA、Hibernate、Toplink、iBatis
  • 对于Ruby,有一个ActiveRecord类
  • 如果你真的喜欢OOP,用谷歌搜索smalltalk持久性:-)

这可能会更好,嗯?工厂方法用于提供接口或抽象类型的具体实现,这样,使用接口/抽象类型的人可以在某种程度上与“知道”存在/可用的实现分离。仍然不能完全理解与关联数组的连接…实际上,它不是关联数组。它只是一个普通的、线性的、数字索引的数组。从技术上讲,php中的所有数组都是关联的,所以这里没有任何问题,除了对工厂模式的轻微误用。@Jonah,看起来像是phpNutt在那里双重发布了它,然后它被关闭了。这可能会更好,嗯?工厂法用于提供混凝土im