螃蟹学PHP设计模式之单元素模式

14.单元素模式

刚刚完成公司的任务,就把单元素模式先熟悉一下。昨晚学的代理模式和网络和数据库开发关系比较大,今天的单元素模式也叫单例模式,也是和这块作用比较紧密。就像你要去菜市场买菜,你只需要第一次买个篮子就可以了,后面就不需要再买篮子了。在业务开发中,也经常会遇到这种需要重复利用的对象,如果多次实例化肯定会产生很多垃圾,影响服务器性能,那么使用单例模式则可以很好的解决。

参考项目模块:邮件模块

其实单例模式用的最多的可能是数据库模块以及商品购物车等,但是邮件模块也是可以用的,基本上任何对象你只需要存在一个对象就可以了的都可以用。这里螃蟹就简单模拟一个单例模式实现的邮件发送模块。

邮件配置对象:

<?php 

class MailConfig{
	protected static $_instance = NULL;
	protected $_handle;
	protected static $_nums=0; //计数器
	public static function createInstance(){
		if(!(self::$_instance instanceof self)){
			self::$_instance = new self;
		}
		
		return self::$_instance;
	}
	
	protected function __construct(){
		$this->_handle = '<br>邮件SMTP服务器:[email protected];[email protected];username=pangxie;password=pangxie';
		self::$_nums++;
	}
	
	public function send(Mail $mail_data){
		echo '<br>'.$this->_handle;
		echo '<h3>邮件内容</h3>';
		echo '标题:'.$mail_data->title;
		echo '<br>地址:'.$mail_data->to_address;
		echo '<br>内容:'.$mail_data->content;
		echo '<br>实例化次数'.self::$_nums;
	}
}

?>



这个配置对象是采用了单例模式,把对象信息用静态变量$_instance来存储,每次使用createInstance方法调用实例时就先检查有没有实例已经存在,没有则创建实例,存在则返回对象实例,还可以通过$_nums来控制实例个数,这里用来计数。

邮件对象类:Mail.class.php

<?php 
require_once('Mail.config.php');

class Mail{
	public $title = '';
	public $content = '';
	public $to_address = '';
	
	public function __construct($mail_data){
		$this->title = $mail_data['title'];
		$this->content = $mail_data['content'];
		$this->to_address = $mail_data['to_address'];
	}
	
	public function send(){
		$mail_instance = MailConfig::createInstance();
		$mail_instance->send($this);
	}
}

?>



测试类:TestInstance.php

<?php 
require('Mail.class.php');

//测试邮件
$mails = array();
$mails[0] = array('title'=>'欢迎注册好书淘','content'=>'您是好书淘第109位会员,请先验证,祝您生活愉快','to_address'=>'[email protected]');
$mails[1] = array('title'=>'恭喜您正式成为好书淘VIP','content'=>'美好生活从此开始','to_address'=>'[email protected]');

//循环发送
foreach ($mails as $mail_data){
	$mailobj = new Mail($mail_data);
	$mailobj->send();
}
?>



测试结果:

邮件SMTP服务器:[email protected];[email protected];username=pangxie;password=pangxie
邮件内容

标题:欢迎注册好书淘
地址:[email protected]
内容:您是好书淘第109位会员,请先验证,祝您生活愉快
实例化次数1

邮件SMTP服务器:[email protected];[email protected];username=pangxie;password=pangxie
邮件内容

标题:恭喜您正式成为好书淘VIP
地址:[email protected]
内容:美好生活从此开始
实例化次数1



从结果可以看到,邮件发送实例只创建了一次,后面是直接使用的,不必再创建。这个用处还是蛮大的,后面螃蟹再把PHP的对象持久化搞定,相信单例模式肯定会应用的更多。

你可能感兴趣的:(设计模式,PHP,单例模式,单元素模式)