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 相关文章推荐
[FAQ]PHP中的一些常识:类篇
Oct 09 PHP
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
php中取得文件的后缀名?
Feb 20 PHP
php中的ini配置原理详解
Oct 14 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
PHP调用MySQL存储过程并返回值的方法
Dec 26 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
php控制文件下载速度的方法
Mar 24 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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+jquery实时显示网站在线人数的方法
2015/01/04 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
JS实现列表页面隔行变色效果
2017/03/25 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
Python卸载模块的方法汇总
2016/06/07 Python
常见python正则用法的简单实例
2016/06/21 Python
python魔法方法-属性访问控制详解
2016/07/25 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
python3中的eval和exec的区别与联系
2019/10/10 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
《十六年前的回忆》教学反思
2014/02/14 职场文书
给孩子的新年寄语
2014/04/08 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis