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 26 PHP
php Ubb代码编辑器函数代码
Jul 05 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
php生成静态页面的简单示例
Apr 17 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
2014最热门的24个php类库汇总
Dec 18 PHP
php内存缓存实现方法
Jan 24 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
php实现用手机关闭计算机(电脑)的方法
Apr 22 PHP
PHP实现微信发红包程序
Aug 24 PHP
Laravel框架使用Redis的方法详解
May 30 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 的几个配置文件函数
2006/12/21 PHP
一个PHP数组应该有多大的分析
2009/07/30 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
Python 元组(Tuple)操作详解
2014/03/11 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
Python WSGI的深入理解
2018/08/01 Python
python实现zabbix发送短信脚本
2018/09/17 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
Python 项目转化为so文件实例
2019/12/23 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
说出一些常用的类,包,接口
2014/09/22 面试题
什么是命名空间(NameSpace)
2015/11/24 面试题
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
房屋公证委托书
2014/04/03 职场文书
工作总结与自我评价
2014/09/18 职场文书
检讨书怎么写
2015/05/07 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
物业公司管理制度
2015/08/05 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python