一、简单工厂

通过传不同参数,根据参数实例化出不同的对象实例。

但是如果新增了类,需要修改Factory

<?php
/**
 * 简单工厂模式
 * @author hhcycj
 *
 */
interface db{
    public function conn();
}

/**
 * 
 * @author hhcycj
 *
 */
class Mysql implements db{
    public function conn(){
        echo '连接上mysql';
    }
}
/**
 * 
 * @author hhcycj
 *
 */
class Sqlite implements db{
    public function conn(){
        echo '连接上sqlite';
    }
}

class Factory{
    public static function createDB($type){
        if ($type == 'mysql') {
            return new Mysql();
        }else if ($type == 'sqlite') {
            return new Sqlite();
        }else{
            throw new Exception('Error db type', 1);
        }
    }
}



$mysql = Factory::createDB('mysql');
$mysql->conn();

二、工厂方法

主要就是为每个类,单独新建一个Factory类,每次调用相应的Factory返回需要的对象实例

<?php
/**
 * 工厂模式
 *
 */

interface db{
    public function conn();
}

interface Factory{
    function createDB();
}

class Mysql implements db{
    public function conn(){
        echo '连接上mysql';
    }
}

class Sqlite implements db{
    public function conn(){
        echo '连接上sqlite';
    }
}

class mysqlFactory implements Factory{
    public function createDB(){
        return new Mysql();
    }
}

class sqliteFactory implements Factory{
    public function createDB(){
        return new Sqlite();
    }
}


// 这样不管新增其它什么数据库类,前面的代码都不用改
// 如果需要添加oracle数据库,只要实现db接口和factory工厂方法即可,这就是前面所说的开闭原则
$fact = new mysqlFactory();
$db = $fact->createDB();


$fact = new sqliteFactory();
$db = $fact->createDB();

三、抽象工厂

https://www.cnblogs.com/52fhy/p/7076396.html?utm_source=itdadao&utm_medium=referral