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 远程关机操作的代码
Dec 05 PHP
php 方便水印和缩略图的图形类
May 21 PHP
set_include_path和get_include_path使用及注意事项
Feb 02 PHP
解析在zend Farmework下如何创立一个FORM表单
Jun 28 PHP
PHP生成sitemap.xml地图函数
Nov 13 PHP
php异常处理使用示例
Feb 25 PHP
19个超实用的PHP代码片段
Mar 14 PHP
PHP中copy on write写时复制机制介绍
May 13 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
PHP中递归的实现实例详解
Nov 14 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/06/21 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
初步讲解Python中的元组概念
2015/05/21 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
python的继承知识点总结
2018/12/10 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
python 实现让字典的value 成为列表
2019/12/16 Python
Python实现图片识别加翻译功能
2019/12/26 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
本科毕业自我鉴定
2014/03/20 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
大学生学期个人总结
2015/02/12 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
预备党员自我评价范文
2015/03/04 职场文书
MySQL基础(二)
2021/04/05 MySQL