设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类

1 单例模式简单介绍

单例模式是一种经常使用的软件设计模式。

在它的核心结构中仅仅包括一个被称为单例类的特殊类。

通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问。从而方便对实例个数的控制并节约系统资源。假设希望在系统中某个类的对象仅仅能存在一个。单例模式是最好的解决方式。

2 模式核心思想

1)某个类仅仅能有一个实例;

2)它必须自行创建这个实例;

3)它必须自行向整个系统提供这个实例。

3 模式架构图

4 项目应用

4.1 需求说明

CleverCode在实际的PHP项目中,应用单例模式最多的就是涉及到网络连接的。比方Memcache和Redis连接,一般的需求通常Redis都仅仅有一台server,所以用单例模式将连接封装到getInstance(),这样做的优点是不用每次都去调用connect()方法,降低网络连接开销。

PHP都是单线程同步运行的,所以整个程序仅仅用实例化一个Redis对象就可以。(来之《CleverCode的项目》)

4.2 需求分析

依据4.1能够分析出使用单例模式比較适合php网络连接的操作。如Mysql。Memcache,Redis。Gearman等都能够尝试单例模式。当然Mysql可能涉及到连接池。仅仅须要将单例变成一个数组单例就可以。即$_instance = null,变成$_instance = array(),$_instance[‘con1‘] = new Self(‘conn1‘);$_instance[‘con2‘] = new Self(‘conn2‘);

4.3 程序源代码下载

http://download.csdn.net/detail/clevercode/8783989

4.4 程序说明

须要提前将Memcache与Redis增加到php扩展中。

1)单例模式设计Memcache操作类(MemcacheOperate.php)

<?php

/**
 * MemcacheOperate.php
 *
 * 单例模式设计Memcache操作类
 *
 * Copyright (c) 2015 http://blog.csdn.net/CleverCode
 *
 * modification history:
 * --------------------
 * 2015/6/8, by CleverCode, Create
 *
 */
class MemcacheOperate extends Memcache{

    // 实例
    protected static $_instance = null;

    /**
     * Singleton instance(获取自己的实例)
     *
     * @return MemcacheOperate
     */
    public static function getInstance(){
        if (null === self::$_instance) {

            self::$_instance = new self();
            $host = $_SERVER['MEMCACHE_HOST'];
            $port = $_SERVER['MEMCACHE_PORT'];
            self::$_instance->addServer($host, $port);
        }
        return self::$_instance;
    }
}

2)单例模式设计Redis操作类(RedisOperate.php)

<?

php

/**
 * RedisOperate.php
 *
 * 单例模式设计Redis操作类
 *
 * Copyright (c) 2015 http://blog.csdn.net/CleverCode
 *
 * modification history:
 * --------------------
 * 2015/6/8, by CleverCode, Create
 *
 */
class RedisOperate extends Redis{

    // 实例
    protected static $_instance = null;

    /**
     * Singleton instance(获取自己的实例)
     *
     * @return RedisOperate
     */
    public static function getInstance(){
        if (null === self::$_instance) {

            self::$_instance = new self();
            $host = $_SERVER['REDIS_HOST'];
            $port = $_SERVER['REDIS_PORT'];
            self::$_instance->connect($host, $port);
        }
        return self::$_instance;
    }
}

3)client代码(singletonPattern.php)

<?

php
/**
 * singletonPattern.php
 *
 * 单例模式
 *
 * Copyright (c) 2015 http://blog.csdn.net/CleverCode
 *
 * modification history:
 * --------------------
 * 2015/6/8, by CleverCode, Create
 *
 */

// 载入Memcache
include_once ('MemcacheOperate.php');

// 载入Redis
include_once ('RedisOperate.php');

/*
 * client类
 * 让client和业务逻辑尽可能的分离,减少client和业务逻辑算法的耦合。
 * 使业务逻辑的算法更具有可移植性
 */
class Client{

    /**
     * 初始化配置文件
     *
     * @return null
     */
    public static function initConfig(){
        // Memcache 主机
        $_SERVER['MEMCACHE_HOST'] = '192.168.6.201';

        // Memcache port
        $_SERVER['MEMCACHE_PORT'] = 11211;

        // Redis 主机
        $_SERVER['REDIS_HOST'] = '192.168.6.201';

        // Redis port
        $_SERVER['REDIS_PORT'] = 6379;
    }

    /**
     * 主函数
     *
     * @return null
     */
    public function main(){
        // 初始化配置
        self::initConfig();

        // Memcache key1
        MemcacheOperate::getInstance()->set('key1', 'Memcache CleverCode1', 0, 100);
        echo MemcacheOperate::getInstance()->get('key1');
        echo "\r\n---\r\n";

        // Memcache key2
        MemcacheOperate::getInstance()->set('key2', 'Memcache CleverCode2', 0, 100);
        echo MemcacheOperate::getInstance()->get('key2');
        echo "\r\n---\r\n";

        // Redis key3
        RedisOperate::getInstance()->set('key3', 'Redis CleverCode3');
        echo RedisOperate::getInstance()->get('key3');
        echo "\r\n---\r\n";

        // Redis key4
        RedisOperate::getInstance()->set('key4', 'Redis CleverCode4');
        echo RedisOperate::getInstance()->get('key4');
        echo "\r\n---\r\n";
    }
}

/**
 * 程序入口
 */
function start(){
    $client = new Client();
    $client->main();
}

start();

?>

4.5 程序执行结果展示

5 总结

5.1 长处

1)实例控制

单例模式会阻止其它对象实例化其自己的单例对象的副本,从而确保全部对象都訪问唯一实例。

2)灵活性

由于类控制了实例化过程,所以类能够灵活更改实例化过程。

5.2 缺点

1)开销

尽管数量非常少,但假设每次对象请求引用时都要检查是否存在类的实例,将仍然须要一些开销。能够通过使用静态初始化解决此问题。

2)可能的开发混淆

使用单例对象(尤其在类库中定义的对象)时,开发者必须记住自己不能使用newkeyword实例化对象。

由于可能无法訪问库源码。因此应用程序开发者可能会意外发现自己无法直接实例化此类。

3)对象生存期

不能解决删除单个对象的问题。

在提供内存管理的语言中(比如基于.NET Framework的语言),仅仅有单例类可以导致实例被取消分配,由于它包括对该实例的私有引用。在某些语言中(如 C++),其它类可以删除对象实例,但这样会导致单例类中出现悬浮引用。

版权声明:

1)原创作品。出自"CleverCode的博客",严禁转载,否则追究版权法律责任。

2)原创地址:http://blog.csdn.net/clevercode/article/details/46410055

3)设计模式之PHP项目应用(23种设计模式文件夹):http://blog.csdn.net/clevercode/article/details/45741843(文件夹持续更新。关注请收藏)。

4)博客专栏地址(设计模式之PHP项目应用):http://blog.csdn.net/column/details/phpusedesignpattern.html(博客持续添加。关注请收藏)。

5)欢迎大家关注CleverCode博客很多其它的精彩内容:http://blog.csdn.net/CleverCode

6)欢迎大家关注CleverCode的微博:http://weibo.com/CleverCode

时间: 2024-08-24 01:38:53

设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类的相关文章

从0开始,一起搭框架、做项目(3)公共基础数据操作类 RepositoryBase

索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引 简述 今天我们写一个基础数据的操作类,如果里面有大家不理解的地方,可采取两种方式,第一:提出来,第二:会用就行.这个类呢我一般不去修改它,因为基础操作类,大家也可以直接拷贝到自己的项目中. 项目准备 我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多

自动化运维Python系列之Memcache、Redis操作

Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memcached安装 wget http://memcached.org/latest tar -zxvf memcach

memcache和redis操作

<a href='http://www.cnblogs.com/wupeiqi/articles/5132791.html'></a> 原文地址:https://www.cnblogs.com/BensonChang/p/9135353.html

&quot;围观&quot;设计模式(7)--创建型之单例模式(Singleton Pattern)

单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简化了在复杂环境下的配置管理.----维基百科(WIKIPEDIA) 个人的理解: 单例模式概念比较简单,他的目的就是只允许出现一个该类的实例,经常在JD

设计模式之简单工厂和单例模式

近段时间发现自己越来越懒了,老师早就讲过的东西,一直没有总结!百度了一下,给的答案是设计模式总共23种.简单工厂属于其中一种,而单例模式并不是其中一种.今天总结下使用这两种模式写的项目. 设计模式:设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一

设计模式:学习笔记(1)——单例模式

Java设计模式之单例模式 引入单例模式 什么是单例模式 对于某些类来说,我们只想其拥有一个实例,并且我们仅仅使用这一个实例:比如说线程池,缓存,对话框,处理偏好设置和注册表的对象.日志对象.显卡等设备的驱动程序的对象.这些类对象只能有一个,如果制造出多个实例,就会导致许多问题的产生.例如:程序的行为异常,资源使用过量或者冲突等等. 单例模式正是可以满足我们需求的设计原则:确保一个类只有一个实例,并提供一个全局访问点. 单例模式的经典实现 实现 理解 ? 首先,我们利用静态变量来记录Single

(四)设计模式之PHP项目应用(策略模式:自动驾驶系统)

1 前言 关于策略模式的定义,模式组成,模式核心思想,模式架构图,程序架构等基础知识介绍.请先参考我的另外一篇博客<(三)设计模式之PHP项目应用(策略模式:商场收银系统)>:http://blog.csdn.net/clevercode/article/details/45722661. 2 项目应用 2.1 需求说明 某公司是福特和本田公司的金牌合作伙伴,现要求开发一套自动驾驶系统,只要汽车上安装该系统就可以实现无人驾驶,只用实现启动,转弯,停止功能即可.该系统可以在福特和本田车上使用.这

项目设计之一-------------项目包的设计原则(原)

很久之前把几大名著<敏捷软件开发>.<设计模式>.<大话设计模式>.<重构-改善既有代码的设计>.<轻量级J2EE企业应用实战-Struts+Spring+Hibernate整合开发>等研究了一遍,然后就想做个项目来综合以上知识,现在把项目设计的思路写出来. 包的设计 最好遵循包设计六大原则.前三增加内聚:1.重用发布等价原则:2.共同重用原则.3共同封闭原则.后三增加解耦:4.无环依赖原则,5.稳定依赖原则,6.未定抽象原则.具体参看<敏

(一)设计模式之PHP项目应用(简介)

1 设计模式简介 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的:设计模式使代码编制真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 2 <设计模式之PHP项目应用>写作背景 CleverCode编程也有一段时间了,也有一些编程的心得与体会,想与大家一起交流与探讨. 大学的时候研究了一些算法,但是发现这些