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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
Oct 09 PHP
初探PHP5
Oct 09 PHP
php桌面中心(四) 数据显示
Mar 11 PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 PHP
JS中encodeURIComponent函数用php解码的代码
Mar 01 PHP
php三元运算符知识汇总
Jul 02 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
Oct 14 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 PHP
php实现微信发红包功能
Jul 13 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/11/25 PHP
php 过滤危险html代码
2009/06/29 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
JavaScript 函数replace深入了解
2013/03/14 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
2020/12/13 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
bootstrap table表格插件之服务器端分页实例代码
2018/09/12 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
python统计一个文本中重复行数的方法
2014/11/19 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
python面试题小结附答案实例代码
2019/04/11 Python
Python的pygame安装教程详解
2020/02/10 Python
婚纱摄影师求职信
2014/03/07 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
英语教师求职信范文
2015/03/20 职场文书
飞屋环游记观后感
2015/06/08 职场文书
安全教育日主题班会
2015/08/13 职场文书
spring boot项目application.properties文件存放及使用介绍
2021/06/30 Java/Android
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript