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
snoopy PHP版的网络客户端提供本地下载
Apr 15 PHP
php一句话cmdshell新型 (非一句话木马)
Apr 18 PHP
php面向对象全攻略 (一) 面向对象基础知识
Sep 30 PHP
使用php实现下载生成某链接快捷方式的解决方法
May 07 PHP
PHP删除目录及目录下所有文件的方法详解
Jun 06 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
php类的自动加载操作实例详解
Sep 28 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
Nov 09 PHP
Laravel 集成 Geetest验证码的方法
May 14 PHP
php5对象复制、clone、浅复制与深复制实例详解
Aug 14 PHP
深入解析PHP底层机制及相关原理
Dec 11 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
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
使用PHP curl模拟浏览器抓取网站信息
2013/10/28 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
海量经典的jQuery插件集合
2010/01/12 Javascript
picChange 图片切换特效的函数代码
2010/05/06 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
跟我学习javascript的作用域与作用域链
2015/11/19 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
Python实现类继承实例
2014/07/04 Python
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
Sublime开发python程序的示例代码
2018/01/24 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
python asyncio 协程库的使用
2021/01/21 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
团队口号大全
2014/06/06 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
员工规章制度范本
2015/08/07 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers