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设计模式中的工厂模式
Jun 12 PHP
PHP 处理图片的类实现代码
Oct 23 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
Apr 26 PHP
关于初学PHP时的知识积累总结
Jun 07 PHP
Linux下PHP连接Oracle数据库
Aug 20 PHP
PHP加密解密类实例分析
Apr 20 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
Jul 14 PHP
PHP实现对数字分隔加千分号的方法
Mar 18 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
Jun 03 PHP
php函数式编程简单示例
Aug 08 PHP
Laravel 5+ .env环境配置文件详解
Apr 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
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
PHP 实现链式操作
2021/03/09 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
执行iframe中的javascript方法
2008/10/07 Javascript
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
初识Javascript小结
2015/07/16 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
Bootstrap CSS组件之导航(nav)
2016/12/17 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
prettier自动格式化去换行的实现代码
2020/08/25 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
Python编程scoketServer实现多线程同步实例代码
2018/01/29 Python
利用python修改json文件的value方法
2018/12/31 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
python识别验证码图片实例详解
2020/02/17 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
Python 代码调试技巧示例代码
2020/08/11 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
大学生工作推荐信范文
2013/12/02 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
先进个人事迹材料
2014/12/29 职场文书