Şu anda en iyi yolu Mevcut PHP 5.2 proje üzerinde benim nesneleri oluşturmak için ne olduğunu anlamaya çalışıyorum. Ben temelde tuşları ile nesneleri döndürür bir sicil var. Kayıt belirtilen anahtarla bir nesne yoksa yapıma göre kayıt sağlanan bir fabrika yöntemini çağırarak bir tane oluşturmak için çalışacağız. Calrify için aşağıdaki kodu bakın:
interface IFactory
{
public function createProduct( $key );
}
class Registry
{
private $m_elements = array( );
private $m_factory;
public function __construct( IFactory $factory )
{
$this->m_factory = $factory;
}
public function getElement( $key )
{
if ( !array_key_exists( $key, $this->m_elements ) )
{
$this->m_elements[$key] = $this->m_factory->createProduct( $key );
}
return $this->m_elements[$key];
}
}
Ben nesnelerin kategorilerde farklı çünkü ben böyle, her kategori için bir singleton içine Registry oject wrap farklı kayıtları saklamak istiyorum:
class SpecialRegistry
{
private static $instance = null;
public static function getInstance( )
{
if( self::$instance === null )
{
self::$instance = new Registry( new SpecialFactory( ) );
}
return self::$instance;
}
}
Benim özel sınıf oldukça karmaşık ve farklı nitelikleri ve kompozisyon nesnelerin çok büyük. Ben her farklı uç (örneğin MySQL veritabanı veya dosya akışı) için farklı Fabrikalar zorunda olacak herhangi bir özel uç benim özel sınıf bağlamak istemiyorum. Yani Fabrikalarına yükleme ve başlatma mantığı taşımak istiyorsunuz. Özel sınıfındaki tüm alanları Fabrikası kamu iseniz Ancak bu sadece çalışacak. Bunlar, ancak uygulamanın geri kalanına halka açık olmamalıdır.
In C++ I could use friends to circumvent this problem. Also here on stack overflow I read on nearly the same topic, but applied to C#. It said I should simply set all fields public in the Special class and have the Factory only return an Interface that exposes the methods and attributes I want to be public to the application. But since PHP does not support return type hinting I am not able to return only an interface that the Special class implements. Another way I came up with would be to actually have the SpecialFactory inherit from the Special class making it possible to access private and protected fields from the factory. This is what I called "Bastard Factory" since the factory inherits from it's own product.
Sizi kimse ne istediğinizi elde daha iyi bir yol ile gelip eğer bilmek isteyen ediyorum. Ya tam kapalı tamamen duyuyorum ve fabrika başlatma işlemini verimli no-go mutlak bir? Ben görüşleri hakkında merak ediyorum!