PHP单例模式与工厂模式详解


Posted in PHP onAugust 29, 2017

一、单例模式又称为职责模式,它用来在程序中创建一个单一功能的访问点,通俗地说就是实例化出来的对象是唯一的。
所有的单例模式至少拥有以下三种公共元素:

1. 它们必须拥有一个构造函数,并且必须被标记为private
2. 它们拥有一个保存类的实例的静态成员变量
3. 它们拥有一个访问这个实例的公共的静态方法

单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。 

单例模式实例

<?php
class Single {
  private $name;//声明一个私有的实例变量
  private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
  
  }
 
  static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
  static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
   if(!self::$instance) self::$instance = new self();
   return self::$instance;
  }
 
  public function setname($n){ //给变量$name赋值
$this->name = $n; 
 }
  public function getname(){ //取变量$name的值
return $this->name; 
 }
 }
 
 
 $a = Single::getinstance();
 $b = Single::getinstance();
 $a->setname('hello world');
 $b->setname('good morning');
 echo $a->getname();//good morning
 echo $b->getname();//good morning
?>

二、工厂模式就是一种类,具有为您创建对象的某些方法,这样就可以使用工厂类创建对象,而不直接使用new。

这样如果想更改创建的对象类型,只需更改该工厂即可。

<?php
//工厂类(关于运算符的操作)
class factory{
 public static function dx($ope){
  switch($ope){
   case "+":
    return new plus();
    break;
   case "-":
    return new sub();
    break;
   case "%":
    return new rem();
    break;
  }
 }
} 
$ope = factory::dx("+");
$ope->a = 20;
$ope->b = 10;
echo $ope->opera();

工厂模式实例

class Factory {//创建一个基本的工厂类
  static public function fac($id){//创建一个返回对象实例的静态方法
   if(1 == $id) return new A();
   elseif(2==$id) return new B();
   elseif(3==$id) return new C();
   return new D();
  }
 }
 
 interface FetchName {//创建一个接口
  public function getname();//
 }
 
 class A implements FetchName{
  private $name = "AAAAA";
  public function getname(){ 
return $this->name; 
}
 }
 
 class C implements FetchName{
  private $name = "CCCCC";
  public function getname(){
return $this->name; 
}
 }
 class B implements FetchName{
  private $name = "BBBBB";
  public function getname(){ 
return $this->name;
}
 }
 
 class D implements FetchName{
  private $name = "DDDDD";
  public function getname(){ 
return $this->name; 
}
}
 
 
 $o = Factory::fac(6);//调用工厂类中的方法
 if($o instanceof FetchName){
 echo $o->getname();//DDDDD
 }
 
 $p=Factory::fac(3);
 echo $p->getname();//CCCCC
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
一个ftp类(ini.php)
Oct 09 PHP
html中select语句读取mysql表中内容
Oct 09 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
php树型类实例
Dec 05 PHP
PHP程序员不应该忽略的3点
Oct 09 PHP
php pdo oracle中文乱码的快速解决方法
May 16 PHP
PHP中多线程的两个实现方法
Oct 14 PHP
PHP页面跳转实现延时跳转的方法
Dec 10 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
Feb 15 PHP
Laravel如何自定义command命令浅析
Mar 23 PHP
PHP迭代与递归实现无限级分类
Aug 28 #PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 #PHP
PHP大文件分割上传 PHP分片上传
Aug 28 #PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 #PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 #PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 #PHP
php检查函数必传参数是否存在的实例详解
Aug 28 #PHP
You might like
自动生成文章摘要的代码[PHP 版本]
2007/03/20 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
2016/04/26 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
JavaScript使用readAsDataURL读取图像文件
2017/05/10 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
Python获取运行目录与当前脚本目录的方法
2015/06/01 Python
python executemany的使用及注意事项
2017/03/13 Python
Python实现随机漫步功能
2018/07/09 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
基于python的docx模块处理word和WPS的docx格式文件方式
2020/02/13 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
12月红领巾广播稿
2014/02/13 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
党内外群众意见范文
2015/06/02 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python