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网站提速三大“软”招
Oct 09 PHP
基于mysql的论坛(5)
Oct 09 PHP
MySQL修改密码方法总结
Mar 25 PHP
php合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
php更新mysql后获取影响的行数发生异常解决方法
Mar 28 PHP
php实现字符串首字母转换成大写的方法
Mar 17 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
PHP上传图片类显示缩略图功能
Jun 30 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
Aug 10 PHP
PHP学习记录之数组函数
Jun 01 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
Jun 03 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 遍历XP文件夹下所有文件
2008/11/27 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
JS delegate与live浅析
2013/12/21 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
Python类的继承super相关原理解析
2020/10/22 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
机械绘图员岗位职责
2013/11/19 职场文书
小学英语教学反思案例
2014/02/04 职场文书
七年级生物教学反思
2016/02/20 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
Python中tkinter的用户登录管理的实现
2021/04/22 Python