工厂模式(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. Entity Framework相关介绍

    在深入学习某项技术之前,应该努力形成对此技术的总体印象,并了解其基本原理,本文的目的就在于此. 一.理解EF数据模型 EF本质上是一个ORM框架,它需要把对象映射到底层数据库中的表,为此,它使用了三个 ...

  2. 前端页面卡顿、也许是DOM操作惹的祸?

    界面上UI的更改都是通过DOM操作实现的,并不是通过传统的刷新页面实现 的.尽管DOM提供了丰富接口供外部调用,但DOM操作的代价很高,页面前端代码的性能瓶颈也大多集中在DOM操作上,所以前端性能优化 ...

  3. ABAP 选择屏幕创建标签页

    *&---------------------------------------------------------------------* *& Report ZTEST_TAB ...

  4. win10 uwp 简单MasterDetail

    中文 English 本文主要讲实现一个简单的界面,可以在窗口比较大显示列表和内容,窗口比较小时候显示列表或内容.也就是在窗口比较小的时候,点击列表会显示内容,点击返回会显示列表. 先放图,很简单. ...

  5. 01Vue数据双向绑定

    Vue作为前端MV*架构,Vue.js (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. Vue 的核心库只关注 ...

  6. RabbitMQ 笔记-Exchanges

    Procuder Publish的Message进入了Exchange.接着通过"routing keys", RabbitMQ会找到应该把这个Message放到哪个queue里. ...

  7. JS难点--面向对象(继承)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } 继承 让一个对象拥有另一个对象的属性或者 ...

  8. 如何通过写bat 安装Windows服务,本人亲测成功

    1. 安装的bat文件 @echo on color 2f mode con: cols=80 lines=25 @echo 请按任意键开始安装后台服务... pause cd /d %~dp0 Le ...

  9. 【前端】javascript实现导航栏筋斗云效果特效

    实现效果: 实现效果如下图所示 实现原理: 什么是筋斗云效果: 这个效果很简单,就是鼠标移到其他导航目录时会有背景图片跟着鼠标滑动到当前的目录. 实现思路: 鼠标经过的时候,利用offsetLeft获 ...

  10. DataTable数据修改,换列

    增加列             DataTable table= new DataTable();             table.Columns.Add("ID", type ...