Можно ли создать фабричный класс в PHP?

Как BeanFactory в java:

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

Примечание: это не заводской метод

$instance = new FactoryClass();

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


person user198729    schedule 21.03.2010    source источник
comment
Просто к вашему сведению. Я давал вам инструменты для реализации фабричного класса. Удачи.   -  person cletus    schedule 21.03.2010
comment
Но это не фабричный класс. Теперь я убежден, что невозможно создать достойный фабричный класс в PHP.   -  person user198729    schedule 21.03.2010


Ответы (2)


Вы можете использовать __autoload в сочетании со статическим методом. Это слишком упрощено.

МойОбъект.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();
person Michael Dean    schedule 21.03.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;
   }
}
person corprew    schedule 21.03.2010
comment
Кажется слишком сложным, есть упрощенная версия? - person user198729; 21.03.2010