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 相关文章推荐
gd库图片下载类实现下载网页所有图片的php代码
Aug 20 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
php获取操作系统语言代码
Nov 04 PHP
destoon整合UCenter图文教程
Jun 21 PHP
php中rename函数用法分析
Nov 15 PHP
php类的定义与继承用法实例
Jul 07 PHP
基于PHP实现短信验证码接口(容联运通讯)
Sep 06 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 PHP
完美解决Thinkphp3.2中插入相同数据的问题
Aug 01 PHP
smarty模板的使用方法实例分析
Sep 18 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
基于PHP实现用户在线状态检测
Nov 10 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 保留字列表
2012/10/04 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
js中匿名函数的N种写法
2010/09/08 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
jquery cookie的用法总结
2013/11/18 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
python3音乐播放器简单实现代码
2020/04/20 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
Python实现爬取并分析电商评论
2020/06/19 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
日本无添加化妆品:HABA
2016/08/18 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
计算机科学与技术应届生求职信
2013/11/07 职场文书
总经理职责
2013/12/22 职场文书
《争吵》教学反思
2014/02/15 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
安全施工责任书
2014/08/25 职场文书
投标邀请书范本
2015/02/02 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android