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 相关文章推荐
怎样才能成为PHP高手?学会“懒惰”的编程
Dec 05 PHP
php动态生成函数示例
Mar 21 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
php中二维数组排序问题方法详解
Aug 28 PHP
PHP封装的字符串加密解密函数
Dec 18 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
php查询及多条件查询
Feb 26 PHP
PHP crc32()函数讲解
Feb 14 PHP
PHP CURL使用详解
Mar 21 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 PHP
PHP类的自动加载与命名空间用法实例分析
Jun 05 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
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
ThinkPHP5框架缓存查询操作分析
2018/05/30 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
nodejs实现bigpipe异步加载页面方案
2016/01/26 NodeJs
JQuery的attr 与 val区别
2016/06/12 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
详细的大学生创业计划书模板
2014/01/27 职场文书
《自然之道》教学反思
2014/02/11 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
故意伤害辩护词
2015/05/21 职场文书
不同意离婚上诉状
2015/05/23 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技