为什么要用工厂模式?
  很多没接触过工厂模式的人会不禁问,为啥我要费那么大的劲儿去构造工厂类去创建对象呢?不去套用那些易维护,可扩展之类的话,我们可以考虑这样一个简单的问题。如果项目中,我们通过一个类创建对象。在快完成或者已经完成,要扩展功能的时候,发现原来的类类名不是很合适或者发现类需要添加构造函数参数才能实现功能扩展。我靠!我都通过这个类创建了一大堆对象实例了啊,难道我还要一个一个去改不成?我们现在才感受到了“高内聚低耦合”的博大精深。没问题,工厂方法可以解决这个问题。
  再考虑一下,我要连接数据库,在php里面就有好几种方法,mysql扩展,mysqli扩展,PDO扩展。我就是想要一个对象用来以后的操作,具体要哪个,视情况而定喽。既然你们都是连接数据库的操作,你们就应该拥有相同的功能,建立连接,查询,断开连接...(此处显示接口的重要性)。总而言之,这几种方法应该“团结一致,一致对外”。如何实现呢?利用工厂模式。


//工厂模式,工厂方法:用一个类(工厂模式)通过本身的方法(或静态方法)来实例化一个类并返回一个实例对象;

//特点如下
//工厂模式专门负责实例化有大量公共接口的类
//工厂模式可以动态地决定将哪一个类实例化
//客户类和工厂类是分开的

//缺点:当客户类产品需要修改时,工厂类也要做相应的修改。

//定义数据库方法
interface db{
    function conn();
}

//定义工厂方法
interface Factory{
    function createDB();
}

//实现数据库接口
class dbmysql implements db{
    public function conn(){
        echo '连上了mysql';
    }
}

class dbsqlite implements db{
    public function conn(){
        echo '链接上了sqlite';
    }
}

class dboracle implements db{
    public function conn(){
        echo '链接上了oracle';
    }
}


//实现工厂模式接口
class mysqlFactory implements Factory{
    public  function createDB(){
        return new dbmysql();
    }
}
class sqliteFactory implements Factory{
    public function createDB(){
        return new dbsqlite();
    }
}
class oracleFactory implements Factory{
    public function createDB(){
        return new dboracle();
    }
}



$fact = new mysqlFactory();
$db = $fact->createDB();
$db->conn();

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

$fact = new oracleFactory();
$db = $fact->createDB();
$db->conn();



//工厂模式2
class mysqlFactory2{
    static public function factory($class_name){
        return new $class_name();
    }
 
}

$fact = mysqlFactory2::factory('dbmysql');
$fact->conn();