Introduction

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

创建设计模式包括下面五种设计模式:

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

生成器模式(Builder)

工厂设计模式(Factory Method)

原型设计模式(Prototype Method)

单例设计模式(Singleton)

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

工厂模式

工厂模式,也是五种设计模式中唯一的类的设计模式(Class patterns),即在类中就能实现的设计模式。

听起来挺抽象?对比原型设计模式,这是一种对象设计模式(Object patterns),通过对象的__clone()方法来实现的设计模式。

在工厂模式中,新创建的对象/产品并不依赖于生产它的对象/工厂,新对象和调用者之间是低耦合状态。通常调用者和工厂交互,由工厂来生成新对象,新对象只和工厂有关。

何时使用工厂模式?

简单来说,当需求对类的个数不明确的时候,可以使用工厂模式,如:

你需要创建一个在线博物馆,但你并不确切的知道究竟有多少文物,你不可能无限的增加新的文物类,同时对于损毁的文物,你不可能无限的去清理这些类。

反过来说,如果你确切的知道类的总量,那么你就没有必要使用工程模式,直接通过继承的方式就能实现好的设计。

Example

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

先是一个抽象的工厂类:

abstract class Factory {

protected abstract function create();

public function factoryStart() {

return $this->create();

}

}

?>

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

class WhaleFactory extends Factory {

protected function create() {

$whale = new Whale();

return $whale->create();

}

}

class CarpFactory extends Factory {

protected function create() {

$carp = new Carp();

return $carp->create();

}

}

?>

然后是抽象的动物接口:

interface Animal {

public function create();

}

?>

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

class Whale implements Animal {

private $name;

public function create() {

$this->name = "Whale";

return $this->name . " is created.\n";

}

}

class Carp implements Animal {

private $name;

public function create() {

$this->name = "Carp";

return $this->name . " is created.\n";

}

}

?>

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

$whaleFactory = new WhaleFactory();

echo $whaleFactory->factoryStart();

$carpFactory = new CarpFactory();

echo $carpFactory->factoryStart();

?>

运行一下:

Whale is created.

Carp is created.

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

修改类的方法

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

简单修改一下:

class Whale implements Animal {

private $name;

public function create() {

$this->name = "Whale";

return $this->name . " is created. Whale eats fish.\n";

}

}

class Carp implements Animal {

private $name;

public function create() {

$this->name = "Carp";

return $this->name . " is created. Carp eats moss.\n";

}

}

?>

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

一个工厂

工厂模式的灵活,在于可以只拥有一个工厂,却能生产多个类/产品。

修改我们的抽象工厂,给create()方法增加animal接口:

abstract class Factory {

protected abstract function create(Animal $animal);

public function factoryStart($animal) {

return $this->create($animal);

}

}

?>

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

class AnimalFactory extends Factory {

protected function create(Animal $animal) {

return $animal->create();

}

}

?>

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

$animalFactory = new AnimalFactory();

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

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

?>

运行一下:

Whale is created. Whale eats fish.

Carp is created. Carp eats moss.

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

Summary

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

php工程模式,PHP设计模式(八):工厂模式相关推荐

  1. 工厂模式 java_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  3. java抽象工厂模式_JAVA设计模式-抽象工厂模式

    定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...

  4. 【工厂模式】设计模式之工厂模式【原创】

    摘要:主要是参考列旭松.陈文著的<PHP核心技术与最佳实践>的2.1节. 1.1 简介 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式.工厂模式(Factor ...

  5. 抽象工厂模式_设计模式——抽象工厂模式

    阅读目录 使用频率:★★★★★ 一.什么是抽象工厂模式 二.补充说明 三.角色 四.例子 使用频率:★★★★★ 一.什么是抽象工厂模式 就是对一组具有相同主题的工厂进行封装(维基百科解释的很到位): ...

  6. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  7. 智能家居项目开发: 设计模式(工厂模式)+ 线程池 + Socket (持续更新中)

    智能家居项目开发 一.智能家居功能细节拆分 控制区: 外设区: 面向对象类和对象的概念 结构体新玩法 二.工厂模式 1. 工厂模式的概念 2. 工厂模式的实现 3. 工厂模式使用及功能验证 三.智能家 ...

  8. Java设计模式之工厂模式 (工厂方法模式)

    上一篇我们学习了简单工厂模式,最后对于增加新产品的缺点,我们在工厂方法模式中解决. 为学习简单工厂模式的小伙伴点击这里Java 设计模式之工厂模式(简单工厂模式) 工厂方法模式要点: 避免简单工厂模式 ...

  9. 设计模式之---工厂模式、建造者模式

    ☺ 对于工厂模式,个人学习需要掌握 注意答案的重点标黑了.对于工厂模式.建造者模式,掌握,我下面这几点就很棒棒. 一.工厂模式 1.什么是工厂模式:[关键字factory] 答:创建对象时,不直接ne ...

最新文章

  1. c\c++ 随机数函数
  2. 红黑树的原理_红黑树插入算法实现原理分析
  3. 【WebView】warnning:所有WebView方法必须在主线程调用(4.0) 所有WebView方法必须在同一线程调用(4.4)
  4. 学习android操作系统,学习Android手机操作系统笔记总结
  5. 聊聊高并发(三十三)Java内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型
  6. 语言怎么绘画人物肖像_国画里的新年,看看古人是怎么过年的!
  7. python数据挖掘电影评分分析_Pyhon数据分析项目——男女电影评分差异比较
  8. 【前端统计图】echarts实现单条折线图
  9. MongoDB 教程 | 菜鸟教程
  10. 锁Lock,主要是重入锁和读写锁
  11. Oracle 1204 RAC failover 测试 (六)
  12. “中国十大名校”之争!
  13. 【自定义模块】从西刺免费代理获取IP列表
  14. 步道乐跑 位置模拟刷步数
  15. Tecplot 输入数学符号
  16. 基于PLC的实验室设备远程监控方案
  17. centos7免密登录
  18. 计算机应用研究是什么期刊,发表一篇计算机应用研究期刊论文要多久?
  19. windows server域的信任关系(一)
  20. 程序员视角的计算机系统 第一章 计算机系统之旅

热门文章

  1. 【MediaPipe】(2) AI视觉,人体姿态关键点实时跟踪,附python完整代码
  2. java远程方法调用(rmi)--好_RMI-Java远程方法调用的实现(二)
  3. python3.7.2怎么用不了pillow_python 3.7.0 下pillow安装方法
  4. 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)
  5. 关于 Caused by: java.lang.NoClassDefFoundError: com/alipay/api/AlipayApiException 解决办法
  6. Linux下设置mysql和tomcat开机启动
  7. Unity 创建2D平台游戏开发学习教程
  8. linux 系统调用 read,write和lseek 使用
  9. 一篇文看懂Hadoop
  10. JAVA-初步认识-第十一章-object类-equals方法覆盖