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 相关文章推荐
PHP令牌 Token改进版
Jul 18 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
Laravel中Trait的用法实例详解
Mar 16 PHP
PHP中字符与字节的区别及字符串与字节转换示例
Oct 15 PHP
php自定义时间转换函数示例
Dec 07 PHP
php实现简单加入购物车功能
Mar 07 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
Sep 18 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
Apr 09 PHP
PHP实现文件上传操作和封装
Mar 04 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 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中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
PHP安装memcache扩展的步骤讲解
2019/02/14 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
2013/07/02 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
arcgis for js 修改infowindow样式的方法
2016/11/02 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
python实现归并排序算法
2018/11/22 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
python Tensor和Array对比分析
2020/01/08 Python
Python如何定义接口和抽象类
2020/07/28 Python
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
数控技术应用个人求职信范文
2014/02/03 职场文书
党务公开方案
2014/05/06 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
医学会议开幕词
2016/03/03 职场文书
python 标准库原理与用法详解之os.path篇
2021/10/24 Python
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
MongoDB支持的索引类型
2022/04/11 MongoDB