设为首页 收藏本站
查看: 1177|回复: 0

[经验分享] php设计模式

[复制链接]

尚未签到

发表于 2015-8-25 09:33:07 | 显示全部楼层 |阅读模式


  • 单例模式



    所谓单例模式,也就是在任何时候,应用程序中只会有这个类的一个实例存在。常见的,我们用到单例模式只让一个对象去访问数据库,从而防止打开多个数据库连接。要实现一个单例类应包括以下几点:

    • 和普通类不同,单例类不能被直接实例化,只能是由自身实例化。因此,要获得这样的限制效果,构造函数必须标记为private。
    • 要让单例类不被直接实例化而能起到作用,就必须为其提供这样的一个实例。因此,就必须要让单例类拥有一个能保存类的实例的私有静态成员变量和对应的一个能访问到实例的公共静态方法。
    • 在PHP中,为防止对单例类对象的克隆来打破单例类的上述实现形式,通常还为基提供一个空的私有__clone()方法。
      下面是一个基本的单例模式:



    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);


  • 工厂模式



    工厂模式在于可以根据输入参数或者应用程序配置的不同来创建一种专门用来实现化并返回其它类的实例的类。下面是一个最基本的工厂模式:



    class FactoryBasic {
    public static function create($config) {
    }
    }
    比如这里是一个描述形状对象的工厂,它希望根据传入的参数个数不同来创建不同的形状。



    // 定义形状的公共功能:获取周长和面积。
    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()一个方法,而没有使用工厂模式,则要修改调用形状的代码块。


  • 观察者模式



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



    // 观察者接口
    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.<br/>';
    }
    }
    // 模拟另外一个观察者类
    class OtherObserver extends Observer {
    protected $name = 'other';
    public function onListen($sender, $args) {
    echo 'other observer..<br/>';
    }
    }
    $rs = new RadioStation();
    // 注入观察者
    $rs->addObserver(new RadioStationLogger());
    $rs->addObserver(new OtherObserver());
    // 移除观察者
    $rs->removeObserver('other');
    // 可以看到观察到的信息
    $rs->addListener('cctv');

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103875-1-1.html 上篇帖子: PHP函数: set_time_limit 下篇帖子: linux下安装eaccelerator加速php执行效率
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表