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 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
一个用于MySQL的PHP XML类
Oct 09 PHP
PHP 程序授权验证开发思路
Jul 09 PHP
php文档更新介绍
Jul 22 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
php中简单的对称加密算法实现
Jan 05 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
PHP设计模式之适配器模式定义与用法详解
Apr 03 PHP
PHP xpath()函数讲解
Feb 11 PHP
PHP7内核CGI与FastCGI详解
Apr 14 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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数据表的字段名称和详细信息的方法
2014/09/27 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
PHP闭包函数详解
2016/02/13 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
详解node如何让一个端口同时支持https与http
2017/07/04 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
python 简单的多线程链接实现代码
2016/08/28 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
python 有效的括号的实现代码示例
2019/11/11 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
三维科技面试题
2013/07/27 面试题
C#实现启动一个进程
2016/10/01 面试题
锦旗标语大全
2014/06/23 职场文书
金融保险专业求职信
2014/09/03 职场文书
就业证明函
2015/06/17 职场文书
校运会新闻稿
2015/07/17 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
详解mysql三值逻辑与NULL
2021/05/19 MySQL