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 相关文章推荐
在字符串中把网址改成超级链接
Oct 09 PHP
PHP 彩色文字实现代码
Jun 29 PHP
PHP 魔术函数使用说明
May 14 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
PHP读取文件并可支持远程文件的代码分享
Oct 03 PHP
用php制作简单分页(从数据库读取记录)的方法详解
May 04 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
php数组转成json格式的方法
Mar 09 PHP
php安装swoole扩展的方法
Mar 19 PHP
php微信开发之自定义菜单完整流程
Oct 08 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
Oct 08 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 操作文件的一些FAQ总结
2009/02/12 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
js获取和设置属性的方法
2014/02/20 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
js动态引入的四种方法
2018/05/05 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
50行Python代码实现人脸检测功能
2018/01/23 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
Python中super函数用法实例分析
2019/03/18 Python
Python第三方库face_recognition在windows上的安装过程
2019/05/03 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
Django 批量插入数据的实现方法
2020/01/12 Python
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
学雷锋宣传标语
2014/06/25 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
主持稿开场白
2015/06/01 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL