工厂模式

如果某个类在很多的文件中都new ClassName(),那么万一这个类的名字发生变更或者参数发生变化,如果不使用工厂模式,就需要修改每一个php代码,使用了工厂模式之后,只需要修改工厂类或者方法就可以了。

工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。

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

要使用的不同方法:

<?php 
//eg1
class Test1{
    static function test(){
        echo __FILE__;
    }
}


//eg2
require_once('people.php');
class man implements people{
    public function say(){
        echo '<br>我是man<br>';
    }
    public function read(){
        
    }
}

class women implements people{
    public function say(){
        echo '我是women<br>';
    }
    public function read(){
        
    }
}
?>

定义工厂类:

<?php 
require_once('test.php');

//eg1
class Factory{
    static function createDatabase(){
        $test = new Test1();
        return $test;
    }
}


//eg2
class SimpleFactory{
    //简单工厂里的静态方法-用于创建男人对象
    static function createMan(){
        return new man();
    }

    //简单工厂里的静态方法-用于创建女人对象
    static function createWomen(){
        return new women();
    }
}
?>

定义eg2的接口:

<?php 
/**
 * eg2
 * Interface people
 */
interface people{
    public function say();
    public function read();
}

?>

执行代码:

<?php 
/**
 * 具体调用
 */
require_once('Factory.php');
//eg1
$test = Factory::createDatabase();
$test->test();

//eg2
if(isset($_GET['male'])){
    echo '1<br>';
    $man = SimpleFactory::createMan();
}else{
    echo '2<br>';
    $man = SimpleFactory::createWomen();
}
$man->say();

?>

eg2使用了interface接口,

接口是规定某类必须实现接口中定义的方法,通过关键字interface定义,但是接口中不需要定义方法的具体内容,既不需要有方法体。且,所有的方法都必须是公共的(public)。

好处是规范,每个类都统一。平级的类都必须实现接口中的方法,只是实现的方式不一样。

使用的规范是:

  不能实例化,只能通过implements来声明。使用‘,’间隔,可以声明多个接口。

  接口中的属性必须是常量。

  接口中的方法必须是public,且没有方法体

  接口间可以互相继承

posted @ 2019-03-26 11:37  谦逊的铅笔  阅读(146)  评论(0编辑  收藏  举报