利用的频率可以说是非常之高,它的官方阐明为:定义一个用于创建工具的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。
这个模式本身很大略而且利用在业务较大略的情形下。一样平常用于小项目或者详细产品扩展西席较少的情形(这样工厂类才不用常常变动)。
PS:不修正代码的话,是无法扩展的。

大略工厂的浸染是实例化工具,而不须要客户理解这个工具属于哪个详细的子类。大略工厂实例化的类具有相同的接口或者基类,在子类比较固定并不须要扩展时,可以利用大略工厂,一定程度上可以很好的降落耦合度。
三、案例支付宝、微信、银联的连接办法(connectMode),支付办法(payMode)。利用工厂模式,“客户”就不须要不要知道详细的连接办法和支付办法了,只须要调用connectMode 和payMode即可。MySQL、SQL Server、Oracle等数据库的连接办法(connectMode)、查询办法(selectMode)等操作可以利用工厂模式进行封装。下面的例子会讲到。我们以数据库类创建的案例来说:
产品类/ 数据库系列 / abstract Class DataBase{ abstract function getOne($sql); //获取一条数据的方法} Class SqlServer extends DataBase{ function __construct() { $connect = "SqlServer 连接方法操作 (腾讯云做事器)"; return $connect } function getOne($sql){ return "查询后返回数据结果"; }} Class MySql extends DataBase{ function __construct(){ $connect = "MySql 连接方法操作 (阿里云做事器)"; return $connect } function getOne($sql){ return "查询后返回数据结果"; }}
工厂类
/ 创建数据库的工厂类 / class Factory { static function createDataBase($type) { switch ($type) { case SqlServer: return new SqlServer(); case MySql: return new MySql(); //.... } }
客户类
/ 客户通过工厂获取数据 / class Customer { private $database; function getDataBase($type) { return $this->database = Factory::createDataBase($type); } }$custome = new Customer;$db = $custome->getDataBase("SqlServer"); // 我要获取阿里云的SQL Server数据库的数据。$data = $db->getOne($sql);
四、组成部分
通过以上案例可以得知一样平常情形下工厂模式由以下几个部分组成:
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生详细的工厂产品。如例子中的Factory类。抽象产品角色:它一样平常是详细产品继续的父类或者实现的接口。由接口或者抽象类来实现。如例中的DataBase接口。详细产品角色:工厂类所创建的工具便是此角色的实例。在JAVA中由一个详细类实现,如例子中的MySql和SqlServer类。利用工厂设计模式时必须先归类你的产品(需求)找到共同点和特色,然后根据共同的地方创建各自的产品类,这时候如果没有无法通过客户类去调用每一个产品类,那么耦合度会大大增高(在需求变动的时候), 这时候创建一个工厂类统一管理产品类,再通过客户类调用。 那么可以很好的管理代码并一定程度上的解耦。