2010-04-06 2 views
5

я использовал для создания экземпляра одноплодного класса, как это:Расширение одноэлементен класс

$Singleton = SingletonClassName::GetInstance(); 

и для не класса одноплодного:

$NonSingleton = new NonSingletonClassName; 

я думаю, что мы не должны различать, как мы создаем экземпляр класса, является ли это одноэлементным или нет. если я смотрю в восприятии другого класса, мне все равно, нужен ли класс одиночному классу или нет. так что мне все еще не нравится, как php обрабатывает одноэлементный класс. я думаю, и я всегда хочу написать:

$Singleton = new SingletonClassName; 

только один неэлементный класс, есть ли решение этой проблемы?

+1

Это не вопрос - вы жалуетесь, что вам не нравится, как шаблон сделан. -1 –

+1

Это очень обоснованный вопрос. +1, потому что -1 не: P – Leo

+2

Не используйте PHP? – Kevin

ответ

2

Я бы не рекомендовал его, как это сделает ваш код намного сложнее понять (Люди думают, что новое средство совершенно новый объект). Но тогда я бы не стал вспоминать об использовании Синглтонов.

Основная идея этого кода заключается в том, что существует обертка вокруг синглтона. Все функции и переменные, доступные через эту оболочку, фактически влияют на singleton. Это не идеально, как приведенный ниже код не реализует много магических методов и интерфейсов SPL, но они могут быть добавлены в случае необходимости

Код

/** 
* Superclass for a wrapper around a singleton implementation 
* 
* This class provides all the required functionality and avoids having to copy and 
* paste code for multiple singletons. 
*/ 
class SingletonWrapper{ 
    private $_instance; 
    /** 
    * Ensures only derived classes can be constructed 
    * 
    * @param string $c The name of the singleton implementation class 
    */ 
    protected function __construct($c){ 
     $this->_instance = &call_user_func(array($c, 'getInstance')); 
    } 
    public function __call($name, $args){ 
     call_user_func_array(array($this->_instance, $name), $args); 
    } 
    public function __get($name){ 
     return $this->_instance->{$name}; 
    } 
    public function __set($name, $value){ 
     $this->_instance->{$name} = $value; 
    } 
} 

/** 
* A test singleton implementation. This shouldn't be constructed and getInstance shouldn't 
* be used except by the MySingleton wrapper class. 
*/ 
class MySingletonImpl{ 
    private static $instance = null; 
    public function &getInstance(){ 
     if (self::$instance === null){ 
      self::$instance = new self(); 
     } 
     return self::$instance; 
    } 

    //test functions 
    public $foo = 1; 
    public function bar(){ 
     static $var = 1; 
     echo $var++; 
    } 
} 

/** 
* A wrapper around the MySingletonImpl class 
*/ 
class MySingleton extends SingletonWrapper{ 
    public function __construct(){ 
     parent::__construct('MySingletonImpl'); 
    } 
} 

Примеры

$s1 = new MySingleton(); 
echo $s1->foo; //1 
$s1->foo = 2; 

$s2 = new MySingleton(); 
echo $s2->foo; //2 

$s1->bar(); //1 
$s2->bar(); //2 
+0

ничего себе, это круто. Большое спасибо ! – cakyus

3

Это лучше быть наоборот - обеспечить factory-method для не одиночек, а также получить их экземпляры с помощью:

$NonSingleton = NonSingletonClassName::createInstance(); 

Это рекомендуемая практики для Java (в Effective Java), но это относится для большинства объектно-ориентированных языков.

1

Вы не можете создать Singleton так же, как обычный экземпляр класса. new всегда будет возвращать новый экземпляр, поэтому вы должны иметь конструктор непубличный, и поэтому у вас должно быть другое средство для вызова его из класса.

У вас могут быть заводские методы для всех классов, например. всегда делает getInstance(), как показано в другом ответе. Другим вариантом будет использование Service Locator и Dependency Injection Framework, который знает, нужно ли возвращать что.

1

Основываясь на том, что ключевое слово new означает, что все, что вы хотите, не имеет значения. new создает новый экземпляр класса, вот почему он назвал новые :-)

+0

ха-ха .. вы абсолютно правы :-) – cakyus

1

Я знаю, что это действительно старое сообщение, но я понял шаблон Factory лучше с помощью приведенной ниже ссылки.

Так что если это поможет будущему блуждать. , , , здесь идет

http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/1/

Это было очень просто понять и понять базовую реализацию.

Смежные вопросы