首页 > 代码库 > 生成对象---工厂方法模式

生成对象---工厂方法模式

问题

当代码运行时我们才知道要生成的对象类型(BlogApptEncoder或者MegaBlogApptEncoder)

我们需要能够相对轻松的加入一些新的产品类型(如一种新业务处理方式SyncMl)

每一个产品类型都可定制特定的功能(getHeaderText()和getFooterText())

实现

<?php
/*
 factory_method.php
工厂方法模式把创建者与要生产的产品类分离开,
创建者是一个工厂类,定义了用于生成产品对象的类方法,
如果没有提供默认实现,那就有创建者的子类来执行实例化
一般情况下创建者的每个子类实例化一个相应的产品子类
*/

//产品类
abstract class AppenCoder{
    abstract function encode();
}

class BlogsAppEncoder extends AppenCoder{
    function encode(){
        return "Appointment data encode in Blogs";
    }
}

//创建者,工厂类(用于生成对象的类)
abstract class CommonManager{
     abstract public function getHearText();
     //生成产品对象的类方法
     abstract public function getAppEncoder();
     abstract public function getFooterText();
}

class BlogsManager extends CommonManager{
    public function getHearText(){
        return "BlogsCal header";
    }
    /*
    子类实例化一个产品子类
    */
    public function getAppEncoder(){
        return new BlogsAppEncoder();
    }
    public function getFooterText(){
        return "BlogsCal Footer";
    }
}
$create = new BlogsManager();
$obj = $create->getAppEncoder();//得到一个生成的产品对象
echo $obj ->encode();
?>

 

uml

技术分享

结果

创建者类与产品的层次结构相似,导致特殊代码重复

导致不必要的子类化

 

生成对象---工厂方法模式