资讯专栏INFORMATION COLUMN

【面向对象的PHP】之模式:单例

崔晓明 / 3352人阅读

摘要:单例模式模式系列的开篇,首先介绍的是我最喜欢的单例模式,简单而言,这属于生成一个且只生成一个对象实例的特殊类。问题良好设计的系统通过方法调用传递对象实例。面向对象设计模式目录

单例模式

模式系列的开篇,首先介绍的是我最喜欢的单例模式(Singleton),简单而言,这属于:生成一个、且只生成一个对象实例的特殊类。

这个唯一存在的类,将替代Global关键字,并且更安全。

产生前提

全局变量是OOP程序猿遇到的主要BUG源泉之一,全局变量的冲突也是极其危险的,因为PHP不会对其产生任何级别的错误,如果结果不能直接观测,那么你的程序可能会让你感到懵圈。

尽管命名空间的出现,一定程度上的避免了全局冲突,然而,在空间内的冲突仍然可能存在。可所有的类都可以访问它,全局变量仍是巨大的诱惑。

问题

良好设计的系统:通过方法调用传递对象实例。

每个类都会与背景环境保持独立,并通过清晰的通信方式,与系统中其它部分进行无耦合协作。

但有时,你不得不通过 中间件 来沟通各个组件,中间件会导致依赖、耦合,并且,倘若组件返回的参数之一,包含了这个中间件,将会导致“依赖污染”。

怎样的中间件才能避免上述情况呢?

如同Global,它可以被所有对象使用;

不存储在全局变量中,不接受覆写;

它在整个系统中,是唯一的。

实现

为了解决这个问题,我们可以强行控制“对象实例化”,我们通过简单地定义一个私有构造方法,创建一个无法从外部实例化的类,通过静态方法与静态属性,来间接实例化它:

class Preferences {
    private $props = array();
    private static $instance;
    
    private function __construct() { }
    
    public static function getInstance() {
        if (empty(self::$instance)) {
        self::$instance = new Preferences();
        }
        
        return self::$instance;
    }
    
    public function setProperty($key, $val) {
        $this->props[$key] = $val;
    }
    
    public function getProperty($key) {
        return $this->props[$key];
    }
}

单例类创建完毕后,我们进行测试:

// 设置属性
$pref = Preferences::getInstance();
$pref->setProperty("name", "UiTest");

unset($pref);

// 调用属性
$pref2 = Preferences::getInstance();
echo $pref2->getProperty("name");

最终可以得到输出:UiTest,并且,你可以去设置任何值,来测试它的可用性。

最后附赠一张UML图:

(感谢云绘图软件:ProcessOn)

总结

Bad Result:单例与全局变量都会:创建难以调试的依赖关系、被误用、绕过安全的通信接口,所以,需要谨慎小心的部署单例类。
Nice Result:与全局变量不同,单例的任何错误与冲突,都将以报错的形式出现(除非你关闭了错误提示),这下,你就可以放心的使用它了。

(面向对象设计模式 - 目录)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22515.html

相关文章

  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    Dionysus_go 评论0 收藏0
  • php设计模式

    摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...

    vspiders 评论0 收藏0
  • 面向对象PHP模式:原型

    摘要:原型模式平行的继承层次使用工厂模式在大型设计中,必须去维护大量的产品类。上文中,称之为特殊的耦合在这里我们介绍一种其抽象工厂模式的变体原型模式。面向对象设计模式目录 原型模式 平行的继承层次使用工厂模式在:大型设计中,必须去维护大量的产品类。(上文中,称之为特殊的耦合) 在这里我们介绍一种其抽象工厂模式的变体:原型模式。它使用clone关键词,来复制具体产品类,使得具体产品类能完成自我...

    Alan 评论0 收藏0
  • 优才公开课笔记:php设计模式(一) 单例模式

    摘要:最近开展了三次设计模式的公开课,现在来总结一下设计模式在中的应用,这是第一篇创建型模式之单例模式。不过因为不支持多线程所以不需要考虑这个问题了。 最近开展了三次设计模式的公开课,现在来总结一下设计模式在PHP中的应用,这是第一篇创建型模式之单例模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设计经验的总结。 设计模式不...

    guyan0319 评论0 收藏0
  • 面向对象PHP模式:目录

    摘要:系列目录生成对象的模式面向对象的之模式单例面向对象的之模式工厂方法面向对象的之模式抽象工厂方法面向对象的之模式原型组合类对象的模式面向对象的之模式组合更新装饰模式 系列目录 生成对象的模式 【面向对象的PHP】之模式:单例 【面向对象的PHP】之模式:工厂方法 【面向对象的PHP】之模式:抽象工厂方法 【面向对象的PHP】之模式:原型 组合类/对象的模式 【面向对象的PHP】之模式...

    lieeps 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<