五. PHP模式设计----生成对象

来源:互联网 发布:真实的魔法书淘宝 编辑:程序博客网 时间:2024/06/06 13:29

 

1 对象生成问题  下面代码,主类在自己的内部生成了聚合的对象(四. 设计原则 中也是这么做),这样会限制到了代码的灵活性//雇员抽象类abstract class Employee{    protected $name;    function __construct($name){        $this->name=$name;    }    abstract function fire();}class Minion extends Employee{    function fire(){        print "{$this->name}:I'll clear my desk";    }}//阴险的老板class NastyBoss{    private $employee=array();    function addEmployee($employeeName){        //生成Minion雇员对象        $this->employee[]=new Minion($employeeName);    }    //解雇一名员工    function projectFails(){        if(count($this->employee)>0){            $employee=array_pop($this->employee);            $employee->fire();        }    }}$boss=new NastyBoss();$boss->addEmployee("Bob");$boss->projectFails();2 使用单例模式创建对象class Preferences{    private $propos=array();    private static $instance;    //静态私有构造方法    private function __construct(){}    public static function getInstance(){        if(empty(self::$instance)){            self::$instance=new Preferences();        }        return self::$instance;    }    public function setProperty($key,$val){        $this->propos[$key]=$val;    }    public function getProperty($key){        return $this->propos[$key];    }    }$pref=Preferences::getInstance();$pref->setProperty("Bob", 55);//删除引用unset($pref);$pref=Preferences::getInstance();print $pref->getProperty("Bob");//print=>552 工厂方法模式//工厂方法模式//把创建者和产品类分离开//*管理抽象类(创建者creator)abstract class CommsManager{    abstract function getHeaderText();    abstract function getApptEncoder();    abstract function getFooterText();}class BloggsCommsManager extends CommsManager{    function getHeaderText(){        return "Bloggs HeaderText!";    }    function getApptEncoder(){        return new BloggsApptEncoder();    }    function getFooterText(){        return "Bloggs FooterText!";    }}class MegaCommsManager extends CommsManager{    function getHeaderText(){        return "Bloggs HeaderText!";    }    function getApptEncoder(){        return new MegaApptEncoder();    }    function getFooterText(){        return "Bloggs FooterText!";    }}//*产品抽象类(产品product)abstract class ApptEncoder{    abstract function encode();}//BloggsCal格式的编码器class BloggsApptEncoder extends ApptEncoder{    function encode(){        return "Appointment data encode in BloggsCal format\n";    }}//MegaCal格式的编码器class MegaApptEncoder extends ApptEncoder{    function encode(){        return "Appointment data encode in MegaCal format\n";    }}3 抽象工厂模式      一般来说,抽象工厂模式跟工厂模式是一样的(JAVA,C++),但是在PHP是不同的,由于PHP没有强制要求方法的返回值,所以可以在工厂模式的基础上只定义一个BloggsCommsManager类用来管理全部Bloggs格式的产品(比如产品除了上面的BloggsApptEncoder外,还有BloggsTtdEncoder(办公事宜),BloggsContactEncoder(联系人),此时只需要一个make(Flag),根据flag不同,返回出不同的产品出来4 原型模式//原型模式//与工厂模式比较,好处就是不用每次定义一个新的产品都需要去改动管理类.//直接让新产品自己具备生成自己的功能//*海(产品类)abstract class Sea{}class EarthSea extends Sea{};class MarsSea extends Sea{};abstract class Plains{}class EarthPlains extends Plains{}class MarsPlains extends Plains{}abstract class Forest{}class EarthForest extends Forest{}class MarsForest extends Forest{} //*地形工厂类(管理类)//省去了用于创建各种产品的子类,直接在一开始的时候初始化好产品类,//之后让产品类自己克隆出自己(注意有时候需要进行必要的深度拷贝:产品类中包含其他对象的引用时)class TerrainFactory{    private $sea;    private $plains;    private $forest;    function __construct(Sea $sea,Plains $plains,Forest $forest){        $this->sea=$sea;        $this->plains=$plains;        $this->forest=$forest;    }    //利用工厂类生成产品本身    function getSea(){        return clone $this->sea;    }    function getPlains(){        return clone $this->plains;    }    function getForest(){        return clone $this->forest;    }}//自由组合所需要的类型$factory=new TerrainFactory(new EarthSea(), new MarsPlains(), new EarthForest());print_r($factory);


0 0
原创粉丝点击