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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
一个基于PDO的数据库操作类
Mar 24 PHP
PHP url 加密解密函数代码
Aug 26 PHP
php面向对象 字段的声明与使用
Jun 14 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
php无限遍历目录示例
Feb 21 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
php统计数组元素个数的方法
Jul 02 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
Apr 11 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 PHP
PHP使用QR Code生成二维码实例
Jul 07 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调用mysql存储过程
2007/02/14 PHP
php笔记之:文章中图片处理的使用
2013/04/26 PHP
php汉字转拼音的示例
2014/02/27 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
强制设为首页代码
2006/06/19 Javascript
Js与下拉列表处理问题解决
2014/02/13 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
angular实现表单验证及提交功能
2017/02/01 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
Vue声明式渲染详解
2017/05/17 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
python实现多线程网页下载器
2018/04/15 Python
python使用matplotlib画柱状图、散点图
2019/03/18 Python
python实现爬山算法的思路详解
2019/04/09 Python
python aiohttp的使用详解
2019/06/20 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
幼儿园教师备课制度
2014/01/12 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
公司外出活动方案
2014/08/14 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
Opencv实现二维直方图的计算及绘制
2021/07/21 Python