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 urlencode()与urldecode()函数字符编码原理详解
Dec 06 PHP
PHP循环函数使用介绍之PHP基础入门教程
Sep 21 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
thinkphp autoload 命名空间自定义 namespace
Jul 17 PHP
PHP代码优化技巧小结
Sep 29 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
Nov 10 PHP
PHP中串行化用法示例
Nov 16 PHP
[原创]php实现 data url的图片生成与保存
Dec 04 PHP
thinkPHP5 ACL用户权限模块用法详解
May 10 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
php远程请求CURL案例(爬虫、保存登录状态)
Apr 01 PHP
php实现自动生成验证码的实例讲解
Nov 17 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 email邮箱正则
2008/10/08 PHP
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
jQuery使用手册之一
2007/03/24 Javascript
pjblog中的UBBCode.js
2007/04/25 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
python 数据加密代码
2008/12/24 Python
Python使用multiprocessing创建进程的方法
2015/06/04 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
2019/07/03 Python
python循环输出三角形图案的例子
2019/11/22 Python
python str字符串转uuid实例
2020/03/03 Python
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
怎样写演讲稿
2014/01/04 职场文书
生产部统计员岗位职责
2014/01/05 职场文书
运动会开幕式邀请函
2014/02/03 职场文书
个人合作协议书范本
2014/04/18 职场文书
设计大赛策划方案
2014/06/13 职场文书
前台接待员岗位职责
2015/04/15 职场文书
大学推普周活动总结
2015/05/07 职场文书
创业计划书之美甲店
2019/09/20 职场文书