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 相关文章推荐
PHP4实际应用经验篇(6)
Oct 09 PHP
PHP入门学习的几个不错的实例代码
Jul 13 PHP
php生成随机数或者字符串的代码
Sep 05 PHP
php 删除记录实现代码
Mar 12 PHP
php中截取中文字符串的代码小结
Jul 17 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
PHP多例模式介绍
Jun 24 PHP
限制ckeditor上传图片文件大小的方法
Nov 15 PHP
Thinkphp微信公众号支付接口
Aug 04 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 PHP
PHP PDOStatement::fetch讲解
Jan 31 PHP
php源码的安装方法和实例
Sep 26 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
生成静态页面的php函数,php爱好者站推荐
2007/03/19 PHP
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
关于php curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
记录mysql性能查询过程的使用方法
2013/05/02 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
PHP命名空间(namespace)原理与用法详解
2019/12/11 PHP
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
javascript如何实现create方法
2019/11/04 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
python matplotlib中文显示参数设置解析
2017/12/15 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
C#的几个面试问题
2016/05/22 面试题
学期自我鉴定范文
2013/10/01 职场文书
中专生自我鉴定范文
2014/02/02 职场文书
《童年》教学反思
2014/02/18 职场文书
学生保证书范文
2014/04/28 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
检讨书怎么写?
2019/06/21 职场文书