是否可以在PHP中创建工厂类?

时间:2010-03-21 05:27:29

标签: php factory-pattern

与java中的BeanFactory一样:

  

在更常见的情况下   BeanFactory本身直接创建   bean通过调用它的构造函数   (相当于调用new的Java代码),   class属性指定   要构造的bean的类。   在不太常见的情况下   BeanFactory调用一个静态的,所谓的   在类上创建工厂方法   bean,class属性   指定包含的实际类   静态工厂方法。

注意:这不是工厂方法

$instance = new FactoryClass();

$instance可以是动态的任何类实例

2 个答案:

答案 0 :(得分:1)

您可以将__autoload与静态方法结合使用。这个过分简化了。

<强> MyObject.php:

<?php
class MyObject
{
    public static function Create()
    {
        return new MyObject();
    }

    public function hello()
    {
        print('hello!!!');
    }
}

<强>的index.php

<?php
function __autoload($className)
{
    require_once($className . '.php');
}

$o = MyObject::Create();
$o->hello();

答案 1 :(得分:0)

这是世界上最疯狂的网站,但这似乎包含了您想要的内容:http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/

查看实际网站的使用示例,但与java工厂或多或少类似。


// define abstract 'ArrayFactory' class
abstract class ArrayFactory{
   abstract public function createArrayObj($type); 
}

// define concrete factory to create numerically-indexed array
objects
class NumericArrayFactory extends ArrayFactory{
   private $context='numeric';
   public function createArrayObj($type){
     $arrayObj=NULL;
     switch($type){
       case "uppercase";
         $arrayObj=new UppercasedNumericArrayObj();
         break;
       case "lowercase";
         $arrayObj=new LowercasedNumericArrayObj();
         break;
       default:
         $arrayObj=new LowercasedNumericArrayObj();
         break; 
     }
     return $arrayObj;
   }
}

// define concrete factory to create associative array objects
class AssociativeArrayFactory extends ArrayFactory{
   private $context='associative';
   public function createArrayObj($type){
     $arrayObj=NULL;
     switch($type){
       case "uppercase";
         $arrayObj=new UppercasedAssociativeArrayObj();
         break;
       case "lowercase";
         $arrayObj=new LowercasedAssociativeArrayObj();
         break;
       default:
         $arrayObj=new LowercasedAssociativeArrayObj();
         break; 
     }
     return $arrayObj;
   }
}