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
php ignore_user_abort与register_shutdown_function 使用方法
Jun 14 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
mac下安装nginx和php
Nov 04 PHP
php程序员应具有的7种能力小结
Nov 27 PHP
php获取数组元素中头一个数组元素值的实现方法
Dec 20 PHP
ThinkPHP 3.2 版本升级了哪些内容
Mar 05 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
Feb 18 PHP
php7下的filesize函数
Sep 30 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 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可变函数的经典用法
2013/06/20 PHP
php字符串截取的简单方法
2013/07/04 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
js一组验证函数
2008/12/20 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
vue中将html字符串转换成html后遇到的问题小结
2018/12/10 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Python实现FTP文件传输的实例
2019/07/07 Python
python增加图像对比度的方法
2019/07/12 Python
Django--权限Permissions的例子
2019/08/28 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
旷课检讨书大全
2014/01/21 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
中学生逃课检讨书
2015/02/17 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
工程质量保证书
2015/05/09 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server
Python实现抖音热搜定时爬取功能
2022/03/16 Python