Home  >  Article  >  Backend Development  >  Summary of PHP design patterns_PHP tutorial

Summary of PHP design patterns_PHP tutorial

WBOY
WBOYOriginal
2016-07-21 15:12:41719browse

1. Singleton mode

The so-called singleton mode means that at any time, only one instance of this class will exist in the application. Commonly, we use the singleton mode to only allow one object to access the database, thereby preventing multiple database connections from being opened. To implement a singleton class should include the following points:

Unlike ordinary classes, singleton classes cannot be instantiated directly, but can only be instantiated by themselves. Therefore, to obtain such restrictive effects, the constructor must be marked private.
For a singleton class to function without being instantiated directly, such an instance must be provided for it. Therefore, it is necessary for the singleton class to have a private static member variable that can save the instance of the class and a corresponding public static method that can access the instance.
In PHP, in order to prevent the cloning of the singleton class object from breaking the above implementation form of the singleton class, an empty private __clone() method is usually provided for the base.
The following is a basic singleton pattern:

Copy the code The code is as follows:

class SingetonBasic {
private static $instance;

// other vars..

private function __construct() {
// do construct..
}

private function __clone() {}

public static function getInstance() {
if (!(self::$instance instanceof self)) {
self::$instance = new self();
}
return self ::$instance;
}

// other functions..
}

$a = SingetonBasic::getInstance();
$b = SingetonBasic::getInstance();
var_dump($a === $b);

2. Factory pattern
The factory pattern allows you to create a class specifically designed to implement and return instances of other classes based on input parameters or application configuration. The following is the most basic factory pattern:

Copy code The code is as follows:

class FactoryBasic {
public static function create($config) {

}
}

For example, here is a factory that describes shape objects. It hopes to create different shapes based on the number of parameters passed in.

Copy code The code is as follows:

// 定义形状的公共功能:获取周长和面积。
interface IShape {
    function getCircum();
    function getArea();
}

// 定义矩形类
class Rectangle implements IShape {
    private $width, $height;

    public function __construct($width, $height) {
        $this->width = $width;
        $this->height = $height;
    }

    public function getCircum() {
        return 2 * ($this->width + $this->height);
    }

    public function getArea() {
        return $this->width * $this->height;
    }
}

// 定义圆类
class Circle implements IShape {
    private $radii;

    public function __construct($radii) {
        $this->radii = $radii;
    }

    public function getCircum() {
        return 2 * M_PI * $this->radii;
    }

    public function getArea() {
        return M_PI * pow($this->radii, 2);
    }
}

// 根据传入的参数个数不同来创建不同的形状。
class FactoryShape {
    public static function create() {
        switch (func_num_args()) {
            case 1:
                return new Circle(func_get_arg(0));
                break;
            case 2:
                return new Rectangle(func_get_arg(0), func_get_arg(1));
                break;

        }
    }
}

// 矩形对象
$c = FactoryShape::create(4, 2);
var_dump($c->getArea());
// 圆对象
$o = FactoryShape::create(2);
var_dump($o->getArea());


使用工厂模式使得在调用方法时变得更容易,因为它只有一个类和一个方法,若没有使用工厂模式,则要在调用时决定应该调用哪个类和哪个方法;使用工厂模式还使得未来对应用程序做改变时更加容易,比如要增加一种形状的支持,只需要修改工厂类中的create()一个方法,而没有使用工厂模式,则要修改调用形状的代码块。

3、观察者模式
观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。

一个简单的示例:当听众在收听电台时(即电台加入一个新听众),它将发送出一条提示消息,通过发送消息的日志观察者可以观察这些消息。

复制代码 代码如下:

// 观察者接口
interface IObserver {
    function onListen($sender, $args);
    function getName();
}

// 可被观察接口
interface IObservable {
    function addObserver($observer);
    function removeObserver($observer_name);
}

// 观察者类
abstract class Observer implements IObserver {
    protected $name;

    public function getName() {
        return $this->name;
    }
}

// 可被观察类
class Observable implements IObservable {
    protected $observers = array();

    public function addObserver($observer) {
        if (!($observer instanceof IObserver)) {
            return;
        }
        $this->observers[] = $observer;
    }

    public function removeObserver($observer_name) {
        foreach ($this->observers as $index => $observer) {
            if ($observer->getName() === $observer_name) {
                array_splice($this->observers, $index, 1);
                return;
            }
        }
    }
}

// 模拟一个可以被观察的类:RadioStation
class RadioStation extends Observable {

    public function addListener($listener) {
        foreach ($this->observers as $observer) {
            $observer->onListen($this, $listener);
        }
    }
}

// 模拟一个观察者类
class RadioStationLogger extends Observer {
    protected $name = 'logger';

    public function onListen($sender, $args) {
        echo $args, ' join the radiostation.
';
    }
}

// 模拟另外一个观察者类
class OtherObserver extends Observer {
    protected $name = 'other';
    public function onListen($sender, $args) {
        echo 'other observer..
';
    }
}

$rs = new RadioStation();

// 注入观察者
$rs->addObserver(new RadioStationLogger());
$rs->addObserver(new OtherObserver());

// 移除观察者
$rs->removeObserver('other');

// 可以看到观察到的信息
$rs->addListener('cctv');

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/326618.htmlTechArticle1、单例模式 所谓单例模式,也就是在任何时候,应用程序中只会有这个类的一个实例存在。常见的,我们用到单例模式只让一个对象去访...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn