标签:
在它的核心结构中仅仅包括一个被称为单例类的特殊类。
通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问。从而方便对实例个数的控制并节约系统资源。假设希望在系统中某个类的对象仅仅能存在一个。单例模式是最好的解决方式。
3)它必须自行向整个系统提供这个实例。
PHP都是单线程同步运行的,所以整个程序仅仅用实例化一个Redis对象就可以。(来之《CleverCode的项目》)
<?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; } }
<?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; } }
<?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(); ?>
2)灵活性
由于类控制了实例化过程,所以类能够灵活更改实例化过程。
由于可能无法訪问库源码。因此应用程序开发者可能会意外发现自己无法直接实例化此类。
3)对象生存期
不能解决删除单个对象的问题。
在提供内存管理的语言中(比如基于.NET Framework的语言),仅仅有单例类可以导致实例被取消分配,由于它包括对该实例的私有引用。在某些语言中(如 C++),其它类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类
标签:
原文地址:http://www.cnblogs.com/bhlsheji/p/5260458.html