0

如何在业务逻辑中使用接口?例如,如果我有一个这样的网关接口:

<?php
    interface Gateway()
    {
        function writeToDatabase();
        function readFromDatabase();
    }
?>

以及针对特定数据库的实现:

<?php
    class MySQL implements Gateway
    {
       public function writeToDatabase()
       {
          //Write data to database here....
       }

       public function readFromDatabase()
       {
          //Read data from database here...
       }
   }
?>

如何在我的业务逻辑中使用网关接口而不具体引用 MySQL 类?我可以在类构造函数中键入提示接口,如下所示:

<?php
    class BusinessClass
    {
        private $gateway;

        public function __construct(Gateway $gateway)
        {
           $this->gateway = $gateway;
        }
    }
 ?>

但是我还没有找到一种方法来实例化一个使用 Gateway 接口的新对象,而无需说:

$gateway = new MySQL();

我宁愿不这样做,因为如果我决定为不同的数据库编写网关接口的另一个实现,我将不得不将我的业务逻辑中的所有硬引用从“MySQL”更改为新的实现。这甚至可能吗?

4

1 回答 1

0

您可以使用抽象工厂模式。使用这种模式,您只需在代码的一个点中配置一次具体工厂,仅此而已。

如果您认为过度设计是因为您的应用程序非常简单,请执行以下操作:

Public class GatewayFactory{

Public static IGateWay CreateGateway(){

//read app configuration file, constant or whatever you use to configure gatewaytype in design time or runtime
string gateWayType = readGatewayTypeCofiguration();
if (gateWayType = Constants.MySQL) {return New MySQL()}//Use Constants! Don't hardcode literal Strings
if (gateWayType = Constants.SQLServer) {return New SQLServer()}
//etc...

  }
}

当网关更改时,只需更改配置,其他一切都保持不变。

于 2013-09-27T08:48:02.130 回答