PHP设计模式

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 装饰模式


你可能感兴趣的:(PHP设计模式)