前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP设计模式——单例模式

PHP设计模式——单例模式

作者头像
Lemon黄
发布2019-11-07 19:45:24
4130
发布2019-11-07 19:45:24
举报
文章被收录于专栏:Lemon黄

点击上方“Lemon黄”关注我哦,不定期原创文,定期好技术文推广分享

确保一个类只有一个实例,并提供对其的全局访问入口。

如果你去一家诊所做检查,刚好诊所最近提供了免费药物。这个促销工作进展得非常顺利,前台人员的病人人数都超出他们的承受能力。每个人都很忙,以至于没有一个井井有条的等候室,这简直是一片混乱。接待员中的病人大量涌入后,安妮感到沮丧和压力,她走进诊所负责人的办公室,脱口而出:“我们需要组织病人,否则我们将不知所措”。

诊所的负责人召开会议,要求工作人员提出建议,然后他们想到了售票系统的想法。目的是使患者有条理的等候,以便减轻前台人员的人工登记工作。

让我们来看看我们能提供怎样的帮助。

在进行任何代码设计之前,我们需要了解诊所的状况和能力。该诊所只有一台物理打印机。

我们可以设计TicketPrinter类,类似于以下定义的类:

代码语言:javascript
复制
class TicketPrinter
{
    public $isPaperOut;
    public function __construct()
    {
        $this->isPaperOut = true;
    }
 
    public function printTicket()
    {
        if ($this->isPaperOut) {
            // 装在更多的纸张到打印机
            $this->loadMorePapers();
            $this->isPaperOut = false;
        } else {
            // 打印
            $this->minusPaper();
            echo 'print queue number';
        }
    }
}

每次执行打印作业时,printerTicket()方法都必须检查纸张的状态。如果纸张用完,它将自动加载更多纸张(假设有可能)。

看来我们也需要检查墨水的状态。因此,我们还要添加如下:

代码语言:javascript
复制
class TicketPrinter {
    public $isPaperOut;
    public $isInkOut;
    public function __construct()
    {
        $this->isPaperOut = true;
        $this->isInkOut = true;
    }
 
    public function printTicket()
    {
        if ($this->isPaperOut) {
            // 装在更多的纸张到打印机
            $this->loadMorePapers();
            $this->isPaperOut = false;
        } else if($this->isInkOut ) {
            // 添加墨水
            $this->loadMoreInk();
            $this->isInkOut = false;
        } else {
            // 打印
            $this->minusPaper();
            // 使用墨水
            $this->deductInk();
            echo 'print queue number';
        }
    }
}

看来我们有一个工作中的TicketPrinter,但在继续之前,让我们再次检查一下情况。由于诊所中只有一台物理打印机,因此如果我们偶然创建了两个TicketPrinter类实例,将会发生什么情况。因为他们使用的是同一台共享打印机,所以肯定会引起很大的问题。

您可能会争辩说,我们总是可以只创建另一个TicketPrinter实例,但是如何确保每个人都遵循它呢?因此,我建议在这种情况下使用Singleton(单例)模式。

我们来稍微修改下TicketPrinter类:

代码语言:javascript
复制
class TicketPrinter
{
    private static $uniqueInstance=null;
    public $isPaperOut;
    public $isInkOut;
    private function __construct()
    {
        $this->isPaperOut = true;
        $this->isInkOut   = true;
    }
 
    public static function getInstance()
    {
        if (self::$uniqueInstance==null) {
            self::$uniqueInstance = new TicketPrinter();
        }
        return self::$uniqueInstance;
    }
 
    public function printTicket()
    {
    }
}

由于TicketPrinter的构造函数(__construct())已变为私有,因此构造函数无法正常实例化它。为了获得TicketPrinter的实例,我们改为:

代码语言:javascript
复制
$ticketPrinter = TicketPrinter::getInstance();

如你所见。单例模式(Singleton Pattern)确保在整个系统的任何时候仅存在一个TicketPrinter实例。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lemon黄 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档