工厂模式使用场景:

    1. 简单来说,当需求对类的个数不明确的时候,可以使用工厂模式,如:
    2. 你需要创建一个在线博物馆,但你并不确切的知道究竟有多少文物,你不可能无限的增加新的文物类,
    3. 同时对于损毁的文物,你不可能无限的去清理这些类。
    4. 反过来说,如果你确切的知道类的总量,那么你就没有必要使用工厂模式,直接通过继承的方式就能实现好的设计。

    实例1:

    <?php
    
    //设定数据库接口
    
    interface Db{
    
        public function realwork();
    
    }
    
    //设定工厂接口
    
    interface Factory{
    
        public function facWorking();
    
    }
    
    //MySQL实际功能类
    
    class Mysql implements Db{
    
        public function realWork(){
    
            return '开始使用mysql';
    
        }
    
    }
    
    //Oracle
    
    class Oracle implements db{
    
        public function realWork(){
    
            return '开始使用oracle';
    
        }
    
    }
    
    //NoSQL实际功能类
    
    class Nosql implements db{
    
        public function realWork(){
    
            return '开始使用nosql';
    
        }
    
    }
    
    //对外展示的MySQL工厂类
    
    class FacMysql implements factory{
    
        protected static $database;
    
        public function facWorking(){
    
            self::$database = new Mysql();
    
            return self::$database->realWork();
    
        }
    
    }
    
    //对外展示的Oracle工厂类
    
    class FacOracle implements factory{
    
        protected static $database;
    
        public function facWorking(){
    
            self::$database = new Oracle();
    
            return self::$database->realWork();
    
        }
    
    }
    
    //对外展示的NoSQL工厂类
    
    class FacNosql implements factory{
    
        protected static $database;
    
        public function facWorking(){
    
            self::$database = new Nosql();
    
            return self::$database->realWork();
    
        }
    
    }
    
    //现在我想实现MySQL数据库的功能,但是我只需要调用MySQL的工厂类即可,我无法并且也没必要知道,实际类和方法的名字
    
    $db = new facMysql();
    
    print_r($db->facWorking()); //output:开始使用MySQL
    
    ?>
    

    实例2:

    <?php
    interface IUser
    {
      function getName();
    }
    
    class User implements IUser
    {
      public function __construct( $id ) { }
    
      public function getName()
      {
        return "Jack";
      }
    }
    
    class UserFactory
    {
      public static function Create( $id )
      {
        return new User( $id );
      }
    }
    
    $uo = UserFactory::Create( 1 );
    echo( $uo->getName()."\n" );
    ?>