工厂模式(Factory pattern)和单例模式一样,是另外一种创建型模式。

  和单例模式不同的是,单例模式会创建和管理一个单独的类型的单一对象,工厂模式则是用于创建多种不同类型的类的多个对象。

工厂模式的实现

  简单的工厂模式由三部分组成:

  1. 抽象基类:类中定义抽象一些方法,用以在子类中实现;
  2. 继承自抽象基类的子类:实现基类中的抽象方法;
  3. 工厂类:用以实例化对象。

  下面来一步步实现一个简单的工厂模式程序。

  首先要定义一个抽象基类:

// 定义抽象基类
abstract class People{ // 定义抽象方法
abstract public function work();
}

  增加多个基类的实现:

class Coder extends People{

    public function work("程序员的工作是写代码");
} class Teacher extends People{ public function work("老师的工作是教书育人");
} class Cook extends People{ public function work("厨师的工作是做美味的菜肴");
}

  定义工厂类,用于实现创建不同对象的需求:

//工厂类
Class Factory{ //此方法根据参数创建需要的对象
static function createInstance($job){
$job = ucfirst($job);
return new $job;
} }

  现在,可以运行代码试试:

$p = Factory::createInstance("Teacher");
$p->work();
// 程序输出:老师的工作是教书育人
$m = Factory::createInstance("Coder");
$m->work();
// 程序输出:程序员的工作是写代码
$w = Factory::createInstance("Cook");
$w->work();
// 程序输出:厨师的工作是做美味的菜肴

  或者,可以这样修改基类:

// 定义抽象基类
abstract class People{ // 定义抽象方法
abstract public function work(); /*######################################*/
//定义工厂方法,并使其不可继承
static final function createInstance($job){
$job = ucfirst($job);
return new $job;
}
/*######################################*/
}

  此时,可以这样创建对象:

$p = People::createInstance("Teacher");
$p->work();
// 程序输出:老师的工作是教书育人

工厂模式的优点及使用场景

  优点:降低了程序的耦合度,方便日后的维护及扩展。

  使用场景:

    1.当程序编写的时候,并不能确定在生成对象的时候其确切的对象类型,只有到程序运行的时候才会确定。

    2.在不确定会有多少个处理操作的时候,如针对接收到的数据,处理的逻辑可能会不同,可能以后还会增加新的操作。

PHP设计模式之工厂模式的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  5. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  6. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

  9. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  10. [JS设计模式]:工厂模式(3)

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

随机推荐

  1. IOS应用FFMPEG库

    1.引用资源 build-ffmpeg  ffmpeg库生成 -sh开源地址: https://gist.github.com/m1entus/6983547 iFrameExtractor ffmp ...

  2. 压缩感知“Hello World”代码初步学习

    压缩感知代码初学 实现:1-D信号压缩传感的实现 算法:正交匹配追踪法OMP(Orthogonal Matching Pursuit)   >几个初学问题   1. 原始信号f是什么?我采集的是 ...

  3. CSS组件

    下拉菜单 .dropdown:将下拉菜单触发器和下拉菜单包含在其中 .dropdown-menu:给<ul>制定下拉菜单的样式 .dropup:向上弹出菜单 .dropdown-menu- ...

  4. word2vec 数学原理

    word2vec 是 Google 于 2013 年推出的一个用于获取词向量的开源工具包.我们在项目中多次使用到它,但囿于时间关系,一直没仔细探究其背后的原理. 网络上 <word2vec 中的 ...

  5. visual studio no editoroptiondefinition export found for the given option nam

    今天用VS 2012打开项目,打开项目时,出现以下的bug.解决方法:清理了在C盘用户文件目录下的缓存. 具体的路径是:C:\Users\{当前用户}\AppData\Local\Microsoft\ ...

  6. 【NOIP2016提高组】 Day2 T2 蚯蚓

    题目传送门:https://www.luogu.org/problemnew/show/P2827 自测时被题面所误导...,题面中说逢t的倍数才输出答案,以为有什么玄妙的方法直接将m次操作变成了m/ ...

  7. Fedora 19 搭建Qt环境

    1.搭建桌面环境fedora的源里包含的需要的套件包,用下面命令安装sudo yum intall qt qt-devel qt-x11 qt-doc qt-demos qt-examples qt- ...

  8. [extjs(1)]MyEclipse2014安装ext4插件Spket

    1 解压好的Spket目录如下 2  建议以link方式安装Spket到MyEclipse中 找到MyEclipse的安装目录 如 3  在MyEclipse 的根目录新建一个目录extjs 当然也可 ...

  9. jstl 处理Date 时间

    1.引入 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> < ...

  10. 【20171026早】alert(1) to win - 第六、七、八题

    早上7点起床,又写了一篇小说发在了起点网上,有兴趣的可以看看.点击这里 忙完后,继续练习,刚开始发现自己答题的速度有些慢,可能是因为对于html,javascript知识不是很精通,但是话又说回来,谁 ...