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连mysql和oracle数据库性能比较
Oct 09 PHP
php基础知识:类与对象(3) 构造函数和析构函数
Dec 13 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
Dec 14 PHP
php在线代理转向代码
May 05 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
Jun 18 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
php中get_object_vars()方法用法实例
Feb 08 PHP
PHP微信开发之查询城市天气
Jun 23 PHP
PHP实现的曲线统计图表示例
Nov 10 PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 PHP
PHP数组基本用法与知识点总结
Jun 02 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中接口的应用
2015/08/12 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
Python回调函数用法实例详解
2015/07/02 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
通过实例学习Python Excel操作
2020/01/06 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
如何在python中实现线性回归
2020/08/10 Python
HTML5 UTF-8 中文乱码的解决方法
2013/11/18 HTML / CSS
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
sort命令的作用和用法
2013/08/25 面试题
自考生毕业自我鉴定
2013/10/10 职场文书
优秀毕业大学生推荐信
2013/11/13 职场文书
超市开店计划书
2014/04/26 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
商务司机岗位职责
2015/04/10 职场文书
网络妈妈观后感
2015/06/08 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android