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

PHP三大经典设计模式

作者头像
Mandy的名字被占用了
发布2019-08-13 11:19:30
4510
发布2019-08-13 11:19:30
举报

单例模式

单例模式的含义: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

单例模式的三个要素: 1.保存类唯一实例的静态变量。 2.构造函数和克隆函数必须是私有的,放在外部去实例化,这样就不存在单例模式的意义。 3.提供一个可供外部访问的公共方法,这个方法返回该类的唯一实例。

单例模式的意义: 在PHP中的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。而不完全是对系统资源的节省, 可以避免重复实例化,因为PHP每次实例化一个类之后都会清理掉对应的资源,当再次使用的时候又会在重新去实例化一次。

单例模式使用的场景: 1.数据库操作,减少对数据路的new操作,从而减少内存资源和系统资源的消耗。 2.配置资源的共享,在一个系统中,配置资源都是全局的,使用单例模式也可以减少每次去读取配置带来的内存和系统资源的消耗。

代码演示:

<?php
class Single
{
    public static $attribute = '';

    public static $instance = '';

    private function __construct($attribute = '浪子编程走四方')
    {
        self::$attribute = $attribute;
    }

    public static function getInstance($attribute = '我是编程浪子走四方1')
    {
        if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
        return self::$instance;
    }
}

工厂模式

工厂模式的有含义:

负责生成其他对象的方法。简单的描述就是通过一个工厂类,去实例化其他类或者方法。

工厂模式的意义:

通过使用工厂模式,减少因为多处new同一个类,当这个类发生变法时,则需要多处修改。

代码演示:

<?php
class Factor
{   
    public static function createDB() 
    {
        echo '我生产了一个DB实例';
        return new DB;
    }
}

class DB
{
    public function __construct()
    {
        echo __CLASS__ . PHP_EOL;
    }
}

$db = Factor::createDB();

注册树模式

注册数的含义: 注册树就是将多个对象注册在一个对象池中,当我们需要使用时,直接从对象池获取即可。

注册数模式的优点: 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。 那么注册树模式想解决什么问题呢? 在考虑这个问题前,我们还是有必要考虑下前两种模式目前面临的局限。 首先,单例模式创建唯一对象的过程本身还有一种判断,即判断对象是否存在。存在则返回对象,不存在则创建对象并返回。 每次创建实例对象都要存在这么一层判断。 工厂模式更多考虑的是扩展维护的问题。 总的来说,单例模式和工厂模式可以产生更加合理的对象。怎么方便调用这些对象呢?而且在项目内如此建立的对象好像散兵游勇一样,不便统筹管理安排啊。因 而,注册树模式应运而生。不管你是通过单例模式还是工厂模式还是二者结合生成的对象,都统统给我“插到”注册树上。我用某个对象的时候,直接从注册树上取 一下就好。这和我们使用全局变量一样的方便实用。 而且注册树模式还为其他模式提供了一种非常好的想法。

代码演示:

<?php


/**
 * 单例模式
 */
class Single
{
    public static $attribute = '';

    public static $instance = '';

    private function __construct($attribute = '浪子编程走四方')
    {
        self::$attribute = $attribute;
    }

    public static function getInstance($attribute = '浪子编程走四方1')
    {
        if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
        return self::$instance;
    }
}

/**
 * 工厂模式
 */
class Factory
{
    public static function createObj()
    {
        return Single::getInstance('浪子编程走四方');
    }
}

/**
 * 注册模式
 * 含义:就是将对象放在一个对象池中,使用的时候直接去对象池查找.
 * 需要如下几个操作:
 * 1.注册
 * 2.存放对象池
 * 3.获取
 * 4.销毁
 */
Class Register
{
    // 用一个数组来当做对象池,键当做对象别名,值存储具体对象
    public static $objTree = [];

    // 将对象放在对象池
    public static function set($key, $val)
    {
        return self::$objTree[$key] = $val;
    }

    // 通过对象别名在对象池中获取到对象别名
    public static function get($key)
    {
        return self::$objTree[$key];
    }

    // 通过对象别名将对象从对象池中注销
    public static function _unset($key)
    {
        unset(self::$objTree[$key]);
    }
}

Register::set('single', Factory::createObj());
$single = Register::get('single');
print_r($single);
echo $single::$attribute;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡二条的技术圈 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档