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(windows版本)中的COM函数
Oct 09 PHP
一些常用的php简单命令代码集锦
Sep 24 PHP
CodeIgniter CLI模式简介
Jun 17 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
PHP获取毫秒级时间戳的方法
Apr 15 PHP
php支持中文字符串分割的函数
May 28 PHP
[原创]php实现子字符串位置相互对调互换的方法
Jun 02 PHP
Thinkphp批量更新数据的方法汇总
Jun 29 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
PHP实现网站应用微信登录功能详解
Apr 11 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 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
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
php统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
Linux下实现PHP多进程的方法分享
2012/08/16 PHP
php命名空间学习详解
2014/02/27 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
JS中实现函数return多个返回值的实例
2017/02/21 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
Python datetime包函数简单介绍
2019/08/28 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
如何基于线程池提升request模块效率
2020/04/18 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
简单html5代码获取地理位置
2014/03/31 HTML / CSS
年度考核自我鉴定
2014/02/02 职场文书
工作所在部门证明
2014/09/21 职场文书
2014年后勤管理工作总结
2014/12/01 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android