资讯专栏INFORMATION COLUMN

PHP设计模式(八):工厂模式

sorra / 1676人阅读

摘要:原文地址设计模式八工厂模式在设计模式七设计模式分类中我们提到过创建设计模式,创建设计模式专注于设计对象和实例的创建过程。工厂模式工厂模式,也是五种设计模式中唯一的类的设计模式,即在类中就能实现的设计模式。

原文地址:PHP设计模式(八):工厂模式

Introduction

在PHP设计模式(七):设计模式分类中我们提到过创建设计模式(Creation patterns),创建设计模式专注于设计对象(Object)和实例(Instance)的创建过程。
创建设计模式包括下面五种设计模式:

抽象工厂设计模式(Abstract Factory)

生成器模式(Builder)

工厂设计模式(Factory Method)

原型设计模式(Prototype Method)

单例设计模式(Singleton)

当程序逐渐扩展的时候,需要更多的新对象,新对象的创建不应该依赖于创建者,换句话说,新对象的创建过程,不应该依赖调用创建函数的对象。为了减少冗余,增加拓展性,工厂模式就是一种创建新对象时使用的设计模式。

工厂模式

工厂模式,也是五种设计模式中唯一的类的设计模式(Class patterns),即在类中就能实现的设计模式。
听起来挺抽象?对比原型设计模式,这是一种对象设计模式(Object patterns),通过对象的__clone()方法来实现的设计模式。
在工厂模式中,新创建的对象/产品并不依赖于生产它的对象/工厂,新对象和调用者之间是低耦合状态。通常调用者和工厂交互,由工厂来生成新对象,新对象只和工厂有关。

何时使用工厂模式?

简单来说,当需求对类的个数不明确的时候,可以使用工厂模式,如:
你需要创建一个在线博物馆,但你并不确切的知道究竟有多少文物,你不可能无限的增加新的文物类,同时对于损毁的文物,你不可能无限的去清理这些类。
反过来说,如果你确切的知道类的总量,那么你就没有必要使用工程模式,直接通过继承的方式就能实现好的设计。

Example

还是使用我们惯用的鲸鱼和鲤鱼的例子,现在我们想实现一个海洋馆,目前我们并不确定究竟有多少海洋生物。
先是一个抽象的工厂类:

create();
  }
}
?>

然后是两个工厂:鲸鱼工厂和鲤鱼工厂

create();
  }
}
class CarpFactory extends Factory {
  protected function create() {
    $carp = new Carp();
    return $carp->create();
  }
}
?>

然后是抽象的动物接口:

然后是具体的动物类:鲸鱼类和鲤鱼类

name = "Whale";
    return $this->name . " is created.
";
  }
}
class Carp implements Animal {
  private $name;
  public function create() {
    $this->name = "Carp";
    return $this->name . " is created.
";
  }
}
?>

下面给出使用工厂创建鲸鱼和鲤鱼的代码:

factoryStart();
$carpFactory = new CarpFactory();
echo $carpFactory->factoryStart();
?>

运行一下:

Whale is created.
Carp is created.

到这里你是不是觉得,其实直接生成两个类就行了,何必搞这么复杂?别着急,好戏在后面。

修改类的方法

由于Interface的限制,修改类的方法被限定在了create()方法中,因此可以避免偷懒的程序员新增加的不合理函数。
简单修改一下:

name = "Whale";
    return $this->name . " is created. Whale eats fish.
";
  }
}
class Carp implements Animal {
  private $name;
  public function create() {
    $this->name = "Carp";
    return $this->name . " is created. Carp eats moss.
";
  }
}
?>

由于对象是由工厂造出来的,外部不可能直接调用或者修改类的实现,类的修改被限定在了类的对外接口上。这样的架构易于扩展。

一个工厂

工厂模式的灵活,在于可以只拥有一个工厂,却能生产多个类/产品。
修改我们的抽象工厂,给create()方法增加animal接口:

create($animal);
  }
}
?>

然后合并之前的鲸鱼工厂和鲤鱼工厂:

create();
  }
}
?>

修改使用工厂创建鲸鱼和鲤鱼的代码:

factoryStart(new Whale());
echo $animalFactory->factoryStart(new Carp());
?>

运行一下:

Whale is created. Whale eats fish.
Carp is created. Carp eats moss.

鲸鱼类和鲤鱼类源源不断的从一个工厂中被创建出来了。通过这种设计模式,类的创建过程统一通过一个接口来实现,接口外部并不需要关心类是如何被创建出来的,而接口内部实现也得到了很好的拓展性。

Summary

本文介绍了工厂设计模式,使用这种设计模式,可以让你通过一个或多个工厂的接口,创建无数新类,调用任意类的方法。由于接口严格定义了新类/产品的形态,因此在维护和拓展的时候,可以省去不少力气。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21678.html

相关文章

  • PHP设计模式(九):原型设计模式

    摘要:原型设计模式中的构造函数使用创建新对象时,并不会触发类的构造函数。事实上,使用构造函数并不一定是一个好的设计,由于构造函数内的逻辑无法被外部控制,当需要修改一个类构造时的逻辑时,除了修改类的构造函数实现以外,别无他法,这破坏了类的封装。 原文地址:PHP设计模式(九):原型设计模式 Introduction 在PHP设计模式(八):工厂模式中我们介绍了创建设计模式(Creation p...

    warnerwu 评论0 收藏0
  • JS 设计模式 (建造者模式

    摘要:即建造者模式可以强制实行一种分步骤进行的建造过程。指导类负责调用适当的建造者来组建产品,指导类一般不与产品类发生依赖关系,与指导类直接交互的是建造者类建造者模式优点建造者模式的封装性很好。 建造者模式 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决在软件系统中,有时候面临着一个复杂对象的创建工作,由于需求的变化,这个复杂对象的某些部分经常面临着剧烈的变化...

    tanglijun 评论0 收藏0
  • PHP设计模式(一)简单工厂模式 (Simple Factory For PHP

    摘要:工厂模式使一个类的实例化延迟到其子类。参考系列源地址系列目录设计模式概述设计模式一简单工厂模式设计模式二工厂方法模式设计模式三抽象工厂模式设计模式四单例模式 一、什么是简单工厂模式 简单工厂 (Simple Factory)又称静态工厂方法模式(Static Factory Method Pattern)   使用的频率可以说是非常之高,它的官方解释为:定义一个用于创建对象的接口,让子...

    Hancock_Xu 评论0 收藏0
  • PHP设计模式(二)工厂方法模式(Factory Method)

    摘要:对于这个问题,接下来的工厂方法模式可以解决这个问题。二工厂方法模式的优点拥有良好的封装性,代码结构清晰。参考系列源地址系列目录设计模式概述设计模式一简单工厂模式设计模式二工厂方法模式设计模式三抽象工厂模式设计模式四单例模式 简单工厂简述: 简单工厂模式实现了产品类的代码跟客户端代码分离,但会有一个问题,优秀的代码是符合开闭原则如果你要加一个C类产品,你就要修改工厂类里面的代码,也就是说...

    zhjx922 评论0 收藏0
  • PHP设计模式(三)抽象工厂模式(Abstract Factory)

    摘要:支持增加任意产品抽象工厂用来生产不同产品族的全部产品。对于增加新的产品,无能为力支持增加产品族参考系列源地址系列目录设计模式概述设计模式一简单工厂模式设计模式二工厂方法模式设计模式三抽象工厂模式设计模式四单例模式 一、什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次...

    W_BinaryTree 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<