工厂模式

  问题:在这里我们用数据库来举例。当我们在项目中需要用到数据库的实例时,我们每次都要进行数据库的步骤(连接,关闭等),如果多次使用了,这就显得过程有点繁琐。当某一天,我们要换其他的了,由原先的mysql换成了mysqli或者是pdo,那么,我们就需要把整个项目底朝天,进行之间每个的步骤的修改。这不便于我们的维护。

  概念:工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

  何时使用:我们明确的计划不同条件创建不同的实例时。   简单工厂:把它理解为一个模子,根据外界给定的材料,加上自身封装好的判断,生产出不同类型的相应的产品、对象。仅在于方便管理。  
  

简单工厂模式:把它理解为一个模子,根据外界给定的原料,在加上自身封装好的判断,生产出不同类型的相应的产品、对象。

简单工厂.png

代码事例:

<?php 
class mysql{

} 
class sqlite{

} 
class Factory{
     public static function getDB($type){ 
        if ($type=='mysql') {
             return new mysql(); 
        }else if($type=='sqlite'){
             return new mysqli();
         }
     }
 }
print_r(Factory::getDB('mysql'));//结果:mysql Object()

对于简单工厂模型而言,似乎如果我们需要增加相应的功能,就必须对类进行相应功能的添加。但这似乎不太符合面向对象中的开闭原则(应该对类的增加开放,对类的修改闭合)。那么,抽象工厂类却能够实现这个过程。

抽象工厂(工厂方法):相比于简单工厂模式,没有逻辑判断,基类工厂去实现接口,子类工厂,子工厂去实现判断并能生产出相应功能的对象。


工厂2.JPG


代码事例:

<?php
 class mysql{}
 class sqlite{}
 interface Factory{
     public static function getDB(); 
} 
class mysqlFactory implements Factory{
    public static function getDB(){
         return new mysql();
     } 
} 
class sqliteFactory implements Factory{
     public static function getDB(){
         return new sqlite();
     } 
} 
class pdoFactory implements Factory{
     public static function getDB(){
         return new sqlite();
     } 
} 
$db = mysqlFactory::getDB();
var_dump($db);//结果:object(mysql)#1 (0){}


2 Comments

  1. 头像
    fangle 回复
    2017-05-26 10:33:18

    哟,你也设计模式。推荐 图书馆的 PHP设计模式。和JAVA的设计模式之禅

头像
QQ登录: