php设计模式之简单工厂模式详解


Posted in PHP onSeptember 04, 2014

本文以实例形式较为详细的介绍了PHP设计模式的简单工厂模式,对于进行PHP程序设计来说有很好的借鉴作用。具体如下:

一、概念

简单工厂模式 【静态工厂方法模式】(Static Factory Method)
是类的创建模式

工厂模式的几种形态:

1、简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method)

2、工厂方法模式(Factory Method)又叫做 多态性工厂模式(Polymorphic Factory)

3、抽象工厂模式(Abstract Factory)又叫做 工具箱模式(ToolKit)

二、配图分析:

php设计模式之简单工厂模式详解

三、代码实例

该实例代码经过测试可以运行,具体如下:

<?php
/**
 * 一个事例
 *
 * 一个农场,要向市场销售水果
 * 农场里有三种水果 苹果、葡萄
 * 我们设想:1、水果有多种属性,每个属性都有不同,但是,他们有共同的地方 | 生长、种植、收货、吃
 *       2、将来有可能会增加新的水果、我们需要定义一个接口来规范他们必须实现的方法
 *       3、我们需要获取某个水果的类,要从农场主那里去获取某个水果的实例,来知道如何生长、种植、收货、吃
 */


/**
 * 虚拟产品接口类
 * 定义好需要实现的方法
 */

interface fruit{

  /**
   * 生长
   */
  public function grow();

  /**
   * 种植
   */
  public function plant();

  /**
   * 收获
   */
  public function harvest();

  /**
   * 吃
   */
  public function eat();
  
}

/**
 * 定义具体产品类 苹果
 * 首先,我们要实现所继承的接口所定义的方法
 * 然后定义苹果所特有的属性,以及方法
 */
class apple implements fruit{

  //苹果树有年龄
  private $treeAge;

  //苹果有颜色
  private $color;

  public function grow(){
    echo "grape grow";
  }

  public function plant(){
    echo "grape plant";
  }

  public function harvest(){
    echo "grape harvest";
  }

  public function eat(){
    echo "grape eat";
  }

  //取苹果树的年龄
  public function getTreeAge(){
    return $this->treeAge;
  }

  //设置苹果树的年龄
  public function setTreeAge($age){
    $this->treeAge = $age;
    return trie;
  }

}

/**
 * 定义具体产品类 葡萄
 * 首先,我们要实现所继承的接口所定义的方法
 * 然后定义葡萄所特有的属性,以及方法
 */
class grape implements fruit{

  //葡萄是否有籽
  private $seedLess;

  public function grow(){
    echo "apple grow";
  }

  public function plant(){
    echo "apple plant";
  }

  public function harvest(){
    echo "apple harvest";
  }

  public function eat(){
    echo "apple eat";
  }

  //有无籽取值
  public function getSeedLess(){
    return $this->seedLess;
  }

  //设置有籽无籽
  public function setSeedLess($seed){
    $this->seedLess = $seed;
    return true;
  }
}

/**
 *农场主类 用来获取实例化的水果
 *
 */
class farmer{

  //定义个静态工厂方法
  public static function factory($fruitName){
    switch ($fruitName) {
      case 'apple':
        return new apple();
        break;
      case 'grape':
        return new grape();
        break;
      default:
        throw new badFruitException("Error no the fruit", 1);
        break;
    }
  }
}

class badFruitException extends Exception{
  public $msg;
  public $errType;
  public function __construct($msg = '' , $errType = 1){
    $this->msg = $msg;
    $this->errType = $errType;
  }  
}

/**
 * 获取水果实例化的方法
 */
try{
  $appleInstance = farmer::factory('apple');
  var_dump($appleInstance);
}catch(badFruitException $err){
  echo $err->msg . "_______" . $err->errType;
}

希望本文所述实例对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP4访问Oracle815
Oct 09 PHP
PHP操作文件方法问答
Mar 16 PHP
IStream与TStream之间的相互转换
Aug 01 PHP
php自动加载机制的深入分析
Jun 08 PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
Zend Framework教程之模型Model用法简单实例
Mar 04 PHP
PHP处理CSV表格文件的常用操作方法总结
Jul 01 PHP
Zend Framework数据库操作方法实例总结
Dec 11 PHP
php DES加密算法实例分析
Sep 18 PHP
如何运行/调试你的PHP代码
Oct 23 PHP
Laravel框架表单验证详解
Sep 04 #PHP
Laravel框架中扩展函数、扩展自定义类的方法
Sep 04 #PHP
深入分析PHP引用(&amp;)
Sep 04 #PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 #PHP
CodeIgniter框架URL路由总结
Sep 03 #PHP
Yii 快速,安全,专业的PHP框架
Sep 03 #PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 #PHP
You might like
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
培养自己的php编码规范
2015/09/28 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
php cookie 详解使用实例
2016/11/03 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
一个javascript图片阅览组件
2010/11/09 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
js绑定事件和解绑事件
2017/04/27 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
python查询mysql中文乱码问题
2014/11/09 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
Python中类的初始化特殊方法
2017/12/01 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
Python通过cv2读取多个USB摄像头
2019/08/28 Python
python读写文件write和flush的实现方式
2020/02/21 Python
python实现滑雪者小游戏
2020/02/22 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
2020/03/19 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
18岁生日感言
2014/01/12 职场文书
村级换届选举方案
2014/05/10 职场文书
消防标语大全
2014/06/07 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
2015年营业员工作总结
2015/04/23 职场文书
父母教会我观后感
2015/06/17 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android