论坛首页 编程语言技术论坛

两个简单的php设计模式

浏览 8754 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-11-06  
PHP
1.单例模式
不管多少次实例化类,都只有一个实例存在,适合数据库操作
<?php
class my{
	public static $_instance = NULL;
	public static function getInstance(){
		if(self::$_instance == NULL) 
		self::$_instance = new self();
		return self::$_instance;
	}
	public function red(){
		echo "red";
	}
	public function __construct(){
		echo 1;
	}
}
$db = My::getInstance();
$db->red();
$mm = My::getInstance();
$mm->red();
?>

运行结果:两个对象,执行一次构造方法
2.工厂模式
不同处理对象,内部自动分流处理,但对用户来说,只有一个方法,简单方便
interface Hello{
	function say_hello();
}
class English implements Hello{
	public function say_hello(){
		echo "Hello!";
	}
}
class Chinese implements Hello{
	public function say_hello(){
		echo "你好";
	}
}
class speak{
	public static function factory($type){
		if($type == 1) $temp = new English();
		else if($type == 2) $temp = new Chinese();
		else{
			die("Not supported!");
		}
		return $temp;
	}
}
$test = Speak::factory(1);
$test->say_hello();
   发表时间:2011-11-11  

ITeye的PHP真是寂静...

第二个 虚拟类代替接口 是不是更简洁点。

abstract class Hello {
	abstract function say_hello();
	public static function factory($type){  
        if($type == 1) $temp = new English();  
        else if($type == 2) $temp = new Chinese();  
        else{  
            die("Not supported!");  
        }  
        return $temp;  
    }
}
 
class English {  
    public function say_hello(){  
        echo "Hello!";  
    }  
}  
class Chinese {  
    public function say_hello(){  
        echo "你好";  
    }  
}  

$test = Hello::factory(1);  
$test->say_hello(); 

 

不过,我比较关心二者的效率和实用性的问题。

0 请登录后投票
   发表时间:2011-11-16  
二楼的例子,看着很怪异,使用接口可以明确的知道所调用的方法。用abstract function say_hello();不是很清楚的知道要干什么,同时chinese和english两个类里要是没有say_hello该怎么办?使用接口可以明确的确认包含这个方法
0 请登录后投票
   发表时间:2011-11-16  
第一个有问题,构造函数要设为私有。
第二个模式是不纯工厂,如果利用动态反射技术为更好,另参数最好用静态衡量,不要Hardcode
0 请登录后投票
   发表时间:2011-11-16  
php 真的有必要要用工厂模式吗?单例倒是可以用一下。不过正如楼上说的,构造函数要设为私有
0 请登录后投票
   发表时间:2011-11-16  
$class = new {$className}();
更实用
0 请登录后投票
   发表时间:2011-11-17  
trains629 写道
二楼的例子,看着很怪异,使用接口可以明确的知道所调用的方法。用abstract function say_hello();不是很清楚的知道要干什么,同时chinese和english两个类里要是没有say_hello该怎么办?使用接口可以明确的确认包含这个方法


接口与继承抽象类,两者代表的意义是不相同的,不过在你这个简单的例子里面当然没关系了。

至于你后面说的要是子类中没有say_hello怎么办,,,继承抽象类的子类必须实现其抽象方法,这个是不由你的。
0 请登录后投票
   发表时间:2011-11-17  
pochonlee 写道
$class = new {$className}();
更实用


也不一定。。。由于继承链或实际需要的关系,类名有时候会很长很复杂,但利用工厂方法,创建实例的时候只需要传入相应的参数(可以是很简单的参数)即可了。
并且,如果调用实例的人与开发实例的人不一样,工厂方法可以作为两人之间协同工作的一个桥梁,即调用实例的人不需要关心具体的类名。
此外,从可维护性的角度说,如果以后类名或者映射关系需要变动,则只需要更改工厂方法的代码即可,而不需要去各个创建实例的地方逐一修改类名。
0 请登录后投票
   发表时间:2011-11-17  
楼主的单例中,还有以下几点需要注意的:
1,需要给构造函数设置成final private function __construct(){},以防止直接调用new耿创建实例及被子类覆盖
2,需要增加final private function __clone(){},以防止通过对象克隆创建多个实例。
2 请登录后投票
   发表时间:2011-11-25  
看看这个网站 www.wooolove.com 是php写的还是java 写的。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics