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读注册表
Oct 09 PHP
建立文件交换功能的脚本(二)
Oct 09 PHP
解决php中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
可以在线执行PHP代码包装修正版
Mar 15 PHP
PHP 读取Postgresql中的数组
Apr 14 PHP
php读取纯真ip数据库使用示例
Jan 26 PHP
php实现两表合并成新表并且有序排列的方法
Dec 05 PHP
ThinkPHP中使用ajax接收json数据的方法
Dec 18 PHP
php实现上传图片文件代码
Jul 19 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
Feb 22 PHP
CI框架中redis缓存相关操作文件示例代码
May 17 PHP
php写入txt乱码的解决方法
Sep 17 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
获得Google PR值的PHP代码
2007/01/28 PHP
PHP 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
JavaScript 学习点滴记录
2009/04/24 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
用javascript实现自动输出网页文本
2015/07/30 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
python判断windows系统是32位还是64位的方法
2015/05/11 Python
python实现给数组按片赋值的方法
2015/07/28 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
国际贸易个人求职信范文
2014/01/04 职场文书
文秘大学生求职信
2014/02/25 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
使用Ajax实现无刷新上传文件
2022/04/12 Javascript