Посты по тегу "шаблоны проектирования":

Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Шаблон проектирования Strategy

<?php
abstract class Graphic{
    abstract public function draw();
}

class Triangle extends Graphic{
    private $name = '';

    public function __construct($name = 'unknown'){
        $this->name = $name;
    }

    public function draw(){
        echo '-I\'m a triangle '.$this->name.'.<br>';
    }
}

class Container extends Graphic{
    private $name = '';
    private $container = array();

    public function __construct($name = 'unknown'){
        $this->name = $name;
    }

    public function draw(){
        echo 'I\'m a container '.$this->name.'.<br>';
        foreach($this->container as $graphic)
            $graphic->draw();
    }

    public function add(Graphic $graphic){
        $this->container[] = $graphic;
    }

    public function del(Graphic $graphic){
        unset($this->container[$graphic]);
    }
}

$tri1 = new Triangle('1');
$tri2 = new Triangle('2');
$tri3 = new Triangle('3');

$container1 = new Container('1');
$container2 = new Container('2');
$container3 = new Container('3');

$container1->add($tri1);
$container1->add($tri2);
$container2->add($tri3);

$container3->add($container1);
$container3->add($container2);

$container3->draw();
?>

Результатом будет:

I'm a container 3.
I'm a container 1.
-I'm a triangle 1.
-I'm a triangle 2.
I'm a container 2.
-I'm a triangle 3.
Как обрабатывать группу или композицию структур обьектов одновременно? Решение - определить классы для композитных и атомарных обьектов таким образом, чтобы они реализовывали один и тот же интерфейс.
2009-01-13 16:09:58
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Шаблон проектирования Factory

<?php
class Example
{
    // Параметризированный фабричный метод
    public static function factory($type)
    {
        if (include_once 'Drivers/' . $type . '.php') {
            $classname = 'Driver_' . $type;
            return new $classname;
        } else {
            throw new Exception ('Драйвер не найден');
        }
    }
}

//Использование
interface Driver_Interface {
}

class Drivers_MYSQL_PDO implements Driver_Interface {
}

$db = Example::factory("MYSQL_PDO");

?>

Единственным уточнением может быть введение единого интерфейса для всех классов из папки 'Drivers/', а также модификатора private или protected для конструктора класса Example: private __construct Example(){} Взято с http://www.php.net/manual/ru/language.oop5.patterns.php
2009-01-12 15:18:32
Pixel Чтобы добавлять в избранное, нужно авторизироваться

php / Шаблон проектирования Singleton

<?php
class Example
{
    // Содержит экземпляр класса
    private static $instance;
    
    // Закрытый конструктор; предотвращает прямой доступ к
    // созданию объекта
    private function __construct() 
    {
        echo 'Я конструктор';
    }

    // Метод синглтон
    public static function singleton() 
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }
    
    // Метод для примера
    public function bark()
    {
        echo 'Гав!';
    }

    // Предотвращает клонирование экземпляра класса
    public function __clone()
    {
        trigger_error('Клонирование запрещено.', E_USER_ERROR);
    }

}

?>

// Пример работы
// Позволяет вернуть единственный экземпляр класса Example
<?php
// Такой вариант завершится неудачей, так как конструктор
// объявлен как private
$test = new Example;

// Это всегда возвращает единственный экземпляр класса
$test = Example::singleton();
$test->bark();

// Это вызовет ошибку E_USER_ERROR.
$test_clone = clone $test;

?>
Хрестоматийный пример шаблона проектирования Singleton на php5. Взято с http://www.php.net/manual/ru/language.oop5.patterns.php
2009-01-11 10:58:32
Pixel Чтобы добавлять в избранное, нужно авторизироваться

На правах рекламы

На сайте почему 1с автоматизация в Москве - суперовское решение. Лучшие разработчики Москвы.
Icon-rating-openIcon-rating-openIcon-rating-openIcon-rating-openIcon-rating-open
2012-02-07 02:51:56