自我创造者:这是什么模式?php

自我创造者:这是什么模式?php,php,design-patterns,oop,Php,Design Patterns,Oop,我有几个类基本上是数据库行的接口。由于类假设行已经存在(\uu construct需要一个字段值),因此有一个公共静态函数,允许创建行并返回类的实例 下面是一个伪代码(因此在本例中存在错误和缺失的改进)示例: class fruit { public $id; public function __construct( $id ) { if ( ! is_numeric($id) ) {

我有几个类基本上是数据库行的接口。由于类假设行已经存在(
\uu construct
需要一个字段值),因此有一个公共静态函数,允许创建行并返回类的实例

下面是一个伪代码(因此在本例中存在错误和缺失的改进)示例:

class fruit {

        public $id;

        public function __construct( $id ) {

                if ( ! is_numeric($id) ) {
                    throw new Exception("Id is not numeric.");
                }
                $this->id = $id;
            $sql = "SELECT * FROM Fruits WHERE id = $id";
            ...
            $this->arrFieldValues[$field] = $row[$value];
        }

    public function __get( $var ) {
        return $this->arrFieldValues[$var];
    }

    public function __set( $var, $val ) {
        $sql = "UPDATE fruits SET $var = " .  mysql_real_escape_string($val) . " WHERE id = $this->id";
    }

        public static function create( $fruit ) {

        $sql = "INSERT INTO Fruits ( fruit_name ) VALUE ( '" mysql_real_escape_string($fruit) . "' )";
        $id = mysql_insert_id();        
        $fruit = & new fruit($id);
            return $fruit;

        }
}

$obj1 = fruit::create( "apple" );
$obj2 = & new fruit( 12 );
这种模式叫什么?


编辑:我将示例更改为具有更多数据库接口功能的示例。在大多数情况下,这种类通常会通过
\uu construct()
实例化。但是有时候当你需要先创建一个新行时,你会调用
create()

我想这是最好的选择

工厂方法模式是实现工厂概念的面向对象设计模式

与其他创建模式一样,它处理创建对象(产品)的问题,而不指定要创建的对象的确切类别。factory方法设计模式通过定义用于创建对象的单独方法来处理此问题,然后子类可以重写该方法以指定将要创建的产品的派生类型

在设计模式的范围之外,术语工厂方法也可以指工厂的方法,其主要目的是创建对象

我想这是最重要的

工厂方法模式是实现工厂概念的面向对象设计模式

与其他创建模式一样,它处理创建对象(产品)的问题,而不指定要创建的对象的确切类别。factory方法设计模式通过定义用于创建对象的单独方法来处理此问题,然后子类可以重写该方法以指定将要创建的产品的派生类型

在设计模式的范围之外,术语工厂方法也可以指工厂的方法,其主要目的是创建对象


由于这与数据库有关,我认为这接近于被称为数据映射器的东西


如果您正在PHP中寻找类似的内容,请转到。看看第一个例子:它几乎就是你的代码

由于这与数据库有关,我认为这接近于可以称为数据映射器的东西


如果您正在PHP中寻找类似的内容,请转到。看看第一个例子:它几乎就是你的代码

我不知道这是否真的是工厂模式;此示例只能创建自己的类型。这家工厂似乎是制造各种不同种类物品的交换所。该模式的主要目的是为数据库提供更新和选择;
create()
方法不是它的主要功能。然而,工厂的唯一目的是创建其他对象。虽然在理论上,该示例遵循工厂方法模式所描述的一些逻辑,但在其基本角色中,工厂和产品仅实现了前者。作为工厂本身的产品,这种设计模式的主要价值(松耦合)已经丢失。在维基百科页面上,
Complex
示例有两种方法,它们都创建了相同类型的对象(但它们确实使构造函数私有),因此我不确定它是否必须始终创建不同类的对象。诚然,我不是设计模式方面的专家(事实上恰恰相反),维基百科也不总是值得信任的。在《工厂(软件概念)》一文中,它说单件可以被视为工厂模式。所以,如果创造自己的Singleton是一个工厂,那么这也一定是一个工厂。我选择这个答案:)我不知道这是否真的是工厂模式;此示例只能创建自己的类型。这家工厂似乎是制造各种不同种类物品的交换所。该模式的主要目的是为数据库提供更新和选择;
create()
方法不是它的主要功能。然而,工厂的唯一目的是创建其他对象。虽然在理论上,该示例遵循工厂方法模式所描述的一些逻辑,但在其基本角色中,工厂和产品仅实现了前者。作为工厂本身的产品,这种设计模式的主要价值(松耦合)已经丢失。在维基百科页面上,
Complex
示例有两种方法,它们都创建了相同类型的对象(但它们确实使构造函数私有),因此我不确定它是否必须始终创建不同类的对象。诚然,我不是设计模式方面的专家(事实上恰恰相反),维基百科也不总是值得信任的。在《工厂(软件概念)》一文中,它说单件可以被视为工厂模式。所以,如果创造自己的Singleton是一个工厂,那么这也一定是一个工厂。我选择的答案是:)您不应该通过引用返回新对象(使用
&
)。它不仅不起任何作用,而且在5.3中被弃用。它是一种SQL注入模式。您不应该通过引用返回新对象(使用
&
)。它不仅不起任何作用,而且在5.3中被弃用。它是一种SQL注入模式。