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 Class 文章
Apr 04 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
Oct 08 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
PHP代码优化的53个细节
Mar 03 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
Apr 25 PHP
11个PHPer必须要了解的编程规范
Sep 22 PHP
typecho插件编写教程(六):调用接口
May 28 PHP
php把数组值转换成键的方法
Jul 13 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
Nov 05 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
Feb 14 PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
PHP生成带有雪花背景的验证码
2008/09/28 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
PHP 转义使用详解
2013/07/15 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
了解一点js的Eval函数
2012/07/26 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
jquery Banner轮播选项卡
2016/12/26 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
2017/03/25 jQuery
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
python迭代器的使用方法实例
2013/11/21 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
Python实现Linux监控的方法
2019/05/16 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
学python爬虫能做什么
2020/07/29 Python
thinkphp5 路由分发原理
2021/03/18 PHP
写给女生的道歉信
2014/01/08 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
上班看电影检讨书
2014/02/12 职场文书
普通大学毕业生自荐信范文
2014/02/23 职场文书
国际商务专业求职信
2014/07/15 职场文书
2014年保管员工作总结
2014/11/18 职场文书
介绍信格式
2015/01/30 职场文书
2015年度党员个人总结
2015/02/14 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
Python 正则模块详情
2021/11/02 Python
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers