PHPPHP设计方式之工厂情势

厂子情势的亮点及运用处境

  优点:降低了先后的耦合度,方便日后的保证及扩充。

  使用景况:

    1.当顺序编写制定的时候,并不能够鲜明在转移对象的时候其方便的靶子类型,唯有到程序运维的时候才会鲜明。

    2.在不明确会有稍许个处理操作的时候,如针对接收到的数据,处理的逻辑可能会区别,或者以往还会追加新的操作。 

 

工厂情势的兑现

  简单的厂子格局由三有的组成:

  1. 架空中基地类:类中定义抽象一些主意,用以在子类中落实;
  2. 持续自抽象基类的子类:完成基类中的抽象方法;
  3. PHP,厂子类:用以实例化对象。

  下边来一步步贯彻多少个简练的工厂格局先后。

  首先要定义二个抽象基类:

// 定义抽象基类
abstract class People{

    // 定义抽象方法
    abstract public function work();
}

  扩大三个基类的落实:

class Coder extends People{

    public function work("程序员的工作是写代码");
}

class Teacher extends People{

    public function work("老师的工作是教书育人");
}

class Cook extends People{

    public function work("厨师的工作是做美味的菜肴");
}

  定义务工作厂类,用于落到实处创制差异对象的须要:

//工厂类
Class Factory{

    //此方法根据参数创建需要的对象
    static function createInstance($job){
        $job = ucfirst($job);
        return new $job;
    }

}

  以往,能够运转代码试试:

$p = Factory::createInstance("Teacher");
$p->work();
// 程序输出:老师的工作是教书育人
$m = Factory::createInstance("Coder");
$m->work();
// 程序输出:程序员的工作是写代码
$w = Factory::createInstance("Cook");
$w->work();
// 程序输出:厨师的工作是做美味的菜肴

 

  可能,可以这么修改基类:

// 定义抽象基类
abstract class People{

    // 定义抽象方法
    abstract public function work();

    /*######################################*/
    //定义工厂方法,并使其不可继承
    static final function createInstance($job){
        $job = ucfirst($job);
        return new $job;
    }
    /*######################################*/
}

  此时,能够这么创立对象:

$p = People::createInstance("Teacher");
$p->work();
// 程序输出:老师的工作是教书育人

 

  和单例格局不相同的是,单例格局会成立和管理3个独立的品类的纯粹对象,工厂格局则是用于创建四种差异类型的类的多个指标。

  工厂形式(Factory pattern)和单例方式一样,是此外一种创造型形式。

相关文章