锁定老帖子 主题:两个简单的php设计模式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-11-06
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(); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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();
不过,我比较关心二者的效率和实用性的问题。 |
|
返回顶楼 | |
发表时间:2011-11-16
二楼的例子,看着很怪异,使用接口可以明确的知道所调用的方法。用abstract function say_hello();不是很清楚的知道要干什么,同时chinese和english两个类里要是没有say_hello该怎么办?使用接口可以明确的确认包含这个方法
|
|
返回顶楼 | |
发表时间:2011-11-16
第一个有问题,构造函数要设为私有。
第二个模式是不纯工厂,如果利用动态反射技术为更好,另参数最好用静态衡量,不要Hardcode |
|
返回顶楼 | |
发表时间:2011-11-16
php 真的有必要要用工厂模式吗?单例倒是可以用一下。不过正如楼上说的,构造函数要设为私有
|
|
返回顶楼 | |
发表时间:2011-11-16
$class = new {$className}();
更实用 |
|
返回顶楼 | |
发表时间:2011-11-17
trains629 写道 二楼的例子,看着很怪异,使用接口可以明确的知道所调用的方法。用abstract function say_hello();不是很清楚的知道要干什么,同时chinese和english两个类里要是没有say_hello该怎么办?使用接口可以明确的确认包含这个方法
接口与继承抽象类,两者代表的意义是不相同的,不过在你这个简单的例子里面当然没关系了。 至于你后面说的要是子类中没有say_hello怎么办,,,继承抽象类的子类必须实现其抽象方法,这个是不由你的。 |
|
返回顶楼 | |
发表时间:2011-11-17
pochonlee 写道 $class = new {$className}();
更实用 也不一定。。。由于继承链或实际需要的关系,类名有时候会很长很复杂,但利用工厂方法,创建实例的时候只需要传入相应的参数(可以是很简单的参数)即可了。 并且,如果调用实例的人与开发实例的人不一样,工厂方法可以作为两人之间协同工作的一个桥梁,即调用实例的人不需要关心具体的类名。 此外,从可维护性的角度说,如果以后类名或者映射关系需要变动,则只需要更改工厂方法的代码即可,而不需要去各个创建实例的地方逐一修改类名。 |
|
返回顶楼 | |
发表时间:2011-11-17
楼主的单例中,还有以下几点需要注意的:
1,需要给构造函数设置成final private function __construct(){},以防止直接调用new耿创建实例及被子类覆盖 2,需要增加final private function __clone(){},以防止通过对象克隆创建多个实例。 |
|
返回顶楼 | |
发表时间:2011-11-25
看看这个网站 www.wooolove.com 是php写的还是java 写的。
|
|
返回顶楼 | |