介绍


整体概述

顾名思义,工厂模式就像一个工厂, 提供了一种统一创建(生产)对象的接口。用户提供需要创建的对象的名称,工厂接口根据名称选择相应的子类来构造相应的对象

实现了工厂接口的子类负责执行创造过程

优缺点

  • 优点
    • 调用者想要创建对象,只需要知道其名称就行了
    • 扩展性好,如果想增加一个产品,只需要添加一个工厂类就行了
    • 实现了产品实现和调用者的解耦合,调用者只需要知道接口就行了
  • 缺点

    • 在增加新产品的时候,需要添加一个具体类和对象实现工厂,使得类的数目成倍增加。一定程度上增加了系统的复杂度,也增加了系统具体类的依赖

      使用场景

  • 说明

    • 当我们明确地计划,在不同条件下创建不同实例的时候
    • 当对象比较复杂的时候,比较适合使用工厂模式
  • 举例
    • 在连接服务器的框架时,选择不同的协议进行接口的实现

      拓展

      工厂类可以是单例的,静态的。当然,我个人认为意义不大

      实现(php)


整体概述

需要写的东西有

  • 实体类的接口
  • 若干实体类
  • 一个工厂类

    代码示例

    假设我们的工厂提供三种不同的网络协议供选择

  • 实体类的接口(当然,不一定要用interface,可以是抽象类、父类都行,主要是这么个概念)

    1. <?php
    2. interface WebProtocol
    3. {
    4. public function say();
    5. }
  • 若干实体类 ```php <?php class HttpProtocol implements WebProtocol {

    1. public function say(){
    2. echo "This is Http\n";
    3. }

    }

class FtpProtocol implements WebProtocol { public function say(){ echo “Ftp is This\n”; } }

  1. - 一个工厂类
  2. ```php
  3. <?php
  4. class WebProtocolFactory
  5. {
  6. public function getProtocol($name){
  7. if ($name == 'ftp'){
  8. return new FtpProtocol;
  9. }
  10. else if ($name == 'http'){
  11. return new HttpProtocol;
  12. }
  13. else {
  14. return false;
  15. }
  16. }
  17. }
  • 调用过程 ```php <?php $factory = new WebProtocolFactory;

$protocol1 = $factory->getProtocol(‘ftp’); $protocol1->say();

//Output:Ftp is This ```