<?php
/*单例模式:
 *1、一个private的__construct是必须的,单例类不能在其它类中实例化,只能被自身实例化;
 *2、拥有一个保存类的实例的静态成员变量;
 *3、一个静态的公共方法用于实例化这个类,并访问这个类的实例;
 * */

class Danli
{
    //保存类的实例的静态成员变量
    static private $_instance=null;
    //私有的构造方法
    private function __construct(){
        echo "这是一个构造方法<br>";
    }
    //用于访问类的实例的公共的静态方法
    static public function getInstance(){
        if(!(self::$_instance instanceof Danli)){
            echo "实例化<br>";
            self::$_instance = new self;
        }
        return self::$_instance;
    }
    //类的其它方法
    public function test(){
        //$this->__construct();
        echo "调用成功<br>";
    }
}

$first = Danli::getInstance();
$first->test();
echo "<hr/>";
$second = Danli::getInstance();
$second->test();

echo "<hr/>";

/*
 * 工厂模式
 *使用工厂模式的好处是,如果你想要更改所实例化的类名等,
 * 则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。
 * 为系统结构提供灵活的动态扩展机制,减少了耦合
 * */
interface Drink{
    public function getDrinkName();
}

class AppleDrink implements Drink{
    public function getDrinkName()
    {
        echo "苹果味";
    }
}

class BananaDrink implements Drink{
    public function getDrinkName()
    {
        echo "香蕉味";
    }
}

class OrangeDrink implements Drink{
    public function getDrinkName()
    {
        echo "橘子味";
    }
}

interface FruitFactory{
    public function makeDrink();
}

class AppleFactory implements FruitFactory{
    public function makeDrink()
    {
        return new AppleDrink();
    }
}

class BananaFactory implements FruitFactory{
    public function makeDrink()
    {
        return new BananaDrink();
    }
}

class OrangeFactory implements FruitFactory{
    public function makeDrink()
    {
        return new OrangeDrink();
    }
}

$appleFactory = new AppleFactory();
$apple = $appleFactory->makeDrink();
$apple->getDrinkName();

$orangeFactory = new OrangeFactory();
$orange = $orangeFactory->makeDrink();
$orange->getDrinkName();


echo "<hr>";

/*
 * 策略模式
 *
 *1.定义抽象角色类(定义好各个实现的共同抽象方法)
 *2.定义具体策略类(具体实现父类的共同方法)
 *3.定义环境角色类(私有化申明抽象角色变量,重载构造方法,执行抽象方法)
 *
 * */
abstract class baseAgent { //抽象策略类
    abstract function PrintPage();
}
//用于客户端是IE时调用的类(环境角色)
class ieAgent extends baseAgent {
    function PrintPage() {
        return 'IE';
    }
}
//用于客户端不是IE时调用的类(环境角色)
class otherAgent extends baseAgent {
    function PrintPage() {
        return 'not IE';
    }
}
class Browser { //具体策略角色
    public function call($object) {
        return $object->PrintPage();
    }
}
$bro = new Browser ();
echo $bro->call ( new ieAgent () );

echo "<hr>";

 

posted on 2019-02-13 15:28  雪舞霓裳  阅读(62)  评论(0)    收藏  举报