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 09 PHP
PHP开发的一些注意点总结
Oct 12 PHP
PHP中foreach循环中使用引用要注意的地方
Jan 02 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
php使用异或实现的加密解密实例
Sep 04 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
php快递单号查询接口使用示例
May 05 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
php文件下载处理方法分析
Apr 22 PHP
php微信开发之上传临时素材
Jun 24 PHP
PHP实现登录验证码校验功能
May 17 PHP
阿里云服务器搭建Php+Apache运行环境的详细过程
May 15 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+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
python从sqlite读取并显示数据的方法
2015/05/08 Python
python3操作mysql数据库的方法
2017/06/23 Python
python实现京东秒杀功能
2018/07/30 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
详解Python学习之安装pandas
2019/04/16 Python
Django模板Templates使用方法详解
2019/07/19 Python
Django配置MySQL数据库的完整步骤
2019/09/07 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
材料成型及控制工程专业求职信
2014/06/19 职场文书
出国签证在职证明
2014/09/20 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
民事申诉状范本
2015/05/20 职场文书