Возможно ли создать фабричный класс в PHP? - PullRequest
0 голосов
/ 21 марта 2010

Как BeanFactory в java:

В гораздо более распространенном случае, когда сам BeanFactory напрямую создает компонент, вызывая его конструктор (эквивалент Java-кода, вызывающего new), атрибут class определяеткласс боба, который будет построен.В менее распространенном случае, когда BeanFactory вызывает статический, так называемый метод фабрики для класса для создания компонента, атрибут class указывает фактический класс, содержащий статический метод фабрики.

Примечание: этоне фабричный метод

$instance = new FactoryClass();

$instance может быть динамически любым экземпляром класса

Ответы [ 2 ]

1 голос
/ 21 марта 2010

Вы можете использовать __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();
0 голосов
/ 21 марта 2010

Это самый грязный сайт в мире, но, похоже, он содержит то, что вы хотите: http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/

Смотрите примеры использования на реальном веб-сайте, но более или менее похожий на java factory.


// 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;
   }
}
...