1单例模式 2工厂模式 3组合模式 4装饰模式
1 单例模式
http://blog.csdn.net/jungsagacity/article/details/7618587 这篇文章关于单例模式写的挺好,但我有几点疑问,现表达出来,以后长进
昨天去乐居面试,问了我关于设计模式的问题,我不会,减分。ok
class singleTon { //为何要用private,为何要用static private static $instance; public function __construct() { echo "it's just a test!!!"; } public static function getInstance() { if(is_null(self::$instance)){ self::$instance = new singleTon(); } return self::$instance; } } $obj1 = singleTon::getInstance(); $obj2 = singleTon::getInstance(); if($obj1 === $obj2){ echo "一样的单利"; }
这篇文章中写道要声明对象的变量为静态变量,为什么要是静态变量?
1 其实到现在为止,一直不明白这静态变量到底有什么用,用在什么地方?
声明一个变量或方法为静态,就可以不实例化类而直接访问,但我想知道的是静态属性到底用在哪里呢?
答案:之前不太理解静态变量的用法。
因为这里我们不能再外部直接实例化类,$instance只能声明为静态属性才能正常调用!
2 工厂模式
首先得明白工厂模式是干什么的,工厂故名思议是生产东西,这里生产什么东西呢?这里是用来生产对象的,而且是生产你想要的对象(不需要传入过多的参数,比如说你想实例化一个动物类,你传入一个动物,他就会自动实例化动物类而不会给你实例化人物类),这里是和多态紧密联系在一起的
举例说明
<?php //工厂模式 /* *@ author zhuxinlei *@ date 2013-10-20 *@ detail 工厂模式实例 */ interface getfood { public function eatfood(); } class human implements getfood { function eatfood() { echo "吃馒头"; } } class animal implements getfood { function eatfood() { echo "吃草"; } } /* *@ author zhuxinlei *@ date 2013-10-20 *@ detail 最后封装成型的类 */ class biology { function eatfood($type) { switch($type){ case 'human': $obj = new human(); $obj->eatfood(); break; default: $obj = new animal(); $obj->eatfood(); } } } $obj = biology::eatfood('human'); ?>
3 组合模式
它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
表现实例为可以优化处理递归或分级数据结构
abstract class MenuComponent { public $name; public abstract function getName(); public abstract function add(MenuComponent $menu); public abstract function remove(MenuComponent $menu); public abstract function getChild($i); public abstract function show(); } class MenuItem extends MenuComponent { public function __construct($name) { $this->name = $name; } public function getName(){ return $this->name; } public function add(MenuComponent $menu){ return false; } public function remove(MenuComponent $menu){ return false; } public function getChild($i){ return null; } public function show(){ echo " |-".$this->getName()."<br>"; } } class Menu extends MenuComponent { public $menuComponents = array(); public function __construct($name) { $this->name = $name; } public function getName() { return $this->name; } public function add(MenuComponent $menu) { $this->menuComponents[] = $menu; } public function remove(MenuComponent $menu) { $key = array_search($menu, $this->menuComponents); if($key !== false) unset($this->menuComponents[$key]); } public function getChild($i) { if(isset($this->menuComponents[$i])) return $this->menuComponents[$i]; return null; } public function show() { echo ":" . $this->getName() . "<br>"; foreach($this->menuComponents as $v){ $v->show(); } } } class testDriver { public function run() { $menu1 = new Menu('文学'); $menuitem1 = new MenuItem('绘画'); $menuitem2 = new MenuItem('书法'); $menuitem3 = new MenuItem('小说'); $menuitem4 = new MenuItem('雕刻'); $menu1->add($menuitem1); $menu1->add($menuitem2); $menu1->add($menuitem3); $menu1->add($menuitem4); $menu1->show(); } } $test = new testDriver(); $test->run();
组合模式确实挺好,但实际在用的过程中我却几乎没有用到!
4 装饰模式