2,355   DesignPatterns Java PHP

一,简单工厂模式(Simple Factory):
模拟场景:
汽车店铺里,有些客户购买SUV,有些客户购买BWM,客户只关注现场的汽车,不会关心汽车是如何生产的,这个时候就需要一个工厂来生产SUV、BWM等之类的汽车了。

示例代码如下:

//生产汽车的工具
abstract class Car{
    abstract function create();
}
// suv汽车
class Suv extends Car{
    public function create(){
        echo "create suv car"."\n";
    }
}
// bwm汽车 
class Bwm extends Car{
    public function create(){
        echo "create bwm car"."\n";
    }
}
// 生产汽车的工厂

class Car_Factoty {
    // 生产 suv 汽车
    static function create_suv() {
        return new Suv();
    }
   // 生产 bwm 汽车
    static function create_bwm() {
        return new Bwm();
    }
    
}


echo "\n-------------------------\n";
// 通过工厂生产suv汽车
$suv = Car_Factoty::create_suv();
$suv->create();

// 通过工厂生产bwm汽车
$bwm = Car_Factoty::create_bwm();
$bwm->create();

实际的业务场景:
在更新数据时,需要实例化一个链接数据库的类,后台数据库可能是MySQL、Oracle等,但是业务逻辑只关注更新数据,至于如何链接数据库不太关心的;这个时候就需要提供类似上述工厂的类,来创建一个链接数据库的实例,给业务层使用了。

示例代码如下:


abstract class Connect_abstract{
    abstract function connect();
}
// 链接 MySQL
class MySQL extends Connect_abstract{
    public function connect(){
        echo "connect to MySQL"."\n";
    }
}
// 链接 Oracle
class Oracle extends Connect_abstract{
    public function connect(){
        echo "connect to Oracle"."\n";
    }
}

// 提供链接数据库类的工厂
class Database_Factoty {
    static function connect_mysql() {
        return new MySQL();
    }
    static function connect_oracle() {
        return new Oracle();
    }
    
}


echo "\n-------------------------\n";
// 通过工厂获得MySQL数据库的链接类
$mysql = Database_Factoty::connect_mysql();
$mysql->connect();

// 通过工厂获得Oracle数据库的链接类
$oracle = Database_Factoty::connect_oracle();
$oracle->connect();

由代码可看出,业务层需要链接数据库时,是通过Database_Factoty这个工厂获得链接类的;
业务层只需关注获得和使用数据库链接类,具体如何链接都是交给工厂处理。

以上的代码设计模式成为简单的工厂模式,也叫做静态的工厂方法模式(static factory method)。
下面来看看详细的工厂方法模式。

 

 

二,工厂方法模式(Factory Method):
工厂方法模式是在静态工厂方法模式基础上进行优化
直接看示例代码:

abstract class Connect_abstract{
    abstract function connect();
}

class MySQL extends Connect_abstract{
    public function connect(){
        echo "connect to MySQL"."\n";
    }
}
class Oracle extends Connect_abstract{
    public function connect(){
        echo "connect to Oracle"."\n";
    }
}

// 将工厂类抽象化成接口
abstract class Database_Factoty_abstract{
    abstract function factory();
}
// 新增具体工厂类提供MySQL数据库链接类
class MySQL_Factory extends Database_Factoty_abstract{
     public function factory() {
        return new MySQL();
    }
}

// 新增具体工厂类提供Oracle数据库链接类
class Oracle_Factory extends Database_Factoty_abstract{
    public function factory() {
        return new Oracle();
    }
}

echo "\n-------------------------\n";
$mysql = new MySQL_Factory();
$mysql->factory()->connect();

$oracle = new Oracle_Factory();
$oracle->factory()->connect();

对比简单工厂模式,工厂方法模式把工厂类 Database_Factoty 抽象化成接口 Database_Factoty_abstract,同时新建具体的工厂类 MySQL_Factory 和 Oracle_Factory 来继承这个接口,实现所需功能。

这样的好处是:
当新增数据库类型时,只需新增一个具体的工厂类比如 MongoDB_Factory 来创建链接数据库实例,无需修改工厂类的抽象化接口,达到进一步解耦的作用。
如果是简单工厂模式,需要修改 Database_Factoty 这个工厂类,而这个类有可能被很多地方调用,关联性太强,不利于扩展和维护。

 

三,简单工厂模式和工厂方法模式的优点:

1,工厂模式是一种创建对象实例的模式,为了满足一些复杂或者重复的对象实例过程而设计的。
2,工厂模式也是一种解耦模式,将对象关联弱化,同时提供对象间的交流方法。
3,工厂模式的程序框架是抽象化的,具体功能有具体类实现,非常便于维护,以及进行功能扩展。




Trackbacks/Pingbacks

  1.  抽象工厂模式 | LuckyBird

Leave a Reply

Your email address will not be published. Required fields are marked *