设计模式 -- 单例模式(Java&&PHP)
所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在。就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等。
能够想到的最简单的实现是,把类的构造函数写成private的,从而保证别的类不能实例化此类,然后在类中提供一个静态的实例并能够返回给使用者。这样,使用者就可以通过这个引用使用到这个类的实例了。
单例模式在这里介绍两种,一种是饿汉,一种是懒汉。
饿汉单例模式
package com.yydcdut.singleton1;
public class Single2 {
private Single2(){};
private static Single2 instance = new Single2();
public static Single2 getInstance()
{
return instance;
}
}
这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
懒汉单例模式
package com.yydcdut.singleton1;
public class Single1 {
private Single1() {
};
private static Single1 instance = null;
public static Single1 getInstance() {
if (instance == null)
return instance = new Single1();
else
return instance;
}
}
这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。
测试
package com.yydcdut.singleton1;
public class SingleMain {
public static void main(String[] args) {
Single1 single1 = Single1.getInstance();
Single1 single2 = Single1.getInstance();
System.out.println(single1.toString());
System.out.println(single2.toString());
System.out.println(single1 == single2);
System.out.println("===================");
Single2 single21 = Single2.getInstance();
Single2 single22 = Single2.getInstance();
System.out.println(single21.toString());
System.out.println(single22.toString());
System.out.println(single21 == single22);
}
}
PHP的单例模式
<?php
class DB{
private $link;
private static $instance=null; private function __construct(){
$this->link=mysql_connect('localhost','root','');
mysql_select_db('base',$this->link);
} static function getInstance(){
if(is_null(self::$instance)){
self::$instance=new self;
}
return self::$instance;
} function select(){
$sql="select * from factory";
$result=mysql_query($sql);
if($result && mysql_num_rows($result)>0){
while($arr=mysql_fetch_assoc($result)){
$data[]=$arr;
}
return $data;
}else{
return false;
}
}
} $db=DB::getInstance();
$db=DB::getInstance();
$db=DB::getInstance();
$db=DB::getInstance(); $arr=$db->select();
print_r($arr);
?>
PHP的单例主要用于数据库、访问人数统计之类的,PHP的设计模式当对于Java的来说要少一些,因为PHP太灵活了,比如PHP没有反射,PHP是直接拿到一个String类型的就可以直接new了,我和我的小伙伴们都惊呆了,灵活的让我有时候都会凌乱。
我是天王盖地虎的分割线

源代码:http://pan.baidu.com/s/1dD1Qx01
Java单例.zip
转载请注明出处:http://www.cnblogs.com/yydcdut
设计模式 -- 单例模式(Java&&PHP)的更多相关文章
- 单例模式——Java EE设计模式解析与应用
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
- 最简单的设计模式——单例模式的演进和推荐写法(Java 版)
前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...
- 单例模式——java设计模式
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
- Java设计模式の单例模式
-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
- Java设计模式 - - 单例模式 装饰者模式
Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...
- Java基础知识之设计模式--单例模式
Java设计模式--单例模式 声明:本文根据慕课网汤小洋老师的精品课程整理来的:慕课网 什么是设计模式(Design Pattern)? 设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设 ...
- 【设计模式】Java设计模式 - 单例模式
[设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...
随机推荐
- 装逼利器之DLog -DEBUG
#ifdef DEBUG #define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __L ...
- 打包新版本上传到AppStore时报错 ERROR ITMS-90034:
今天打包新版本上传到AppStore时报错 ERROR ITMS-90034:"Missing or invalid signature.The bundle'com.xxx.xxx' at ...
- 树莓派(Rospberry Pi B+)到货亲测
1 图鉴 Rospberry Pi B+终于在今天下午有蜗牛快递公司圆*送到了.B+主要是增加了2个USB,增加了GPIO,sd卡换成了micro sd ...先不说直接上图再说,期待了好久好久 整 ...
- Windows 7/8/8.1 硬盘安装法实现 ubuntu 14.04 双系统
一.软件准备 1. 下载 Ubuntu 系统镜像:http://www.ubuntu.com/download/desktop/ : 这里使用的是 ubuntu 14.04.1 LTS 64bit 版 ...
- VBA删除表格最后一行
Sub 删除最后一行() If MsgBox("要为所有表格添加列吗?", vbYesNo + vbQuestion) = vbYes Then To ActiveDocument ...
- Win2008R2PHP5.4环境加载Zend模块
1.需要2个文件 Zend Optimizer和Zend Guard Loade s 下载Zend Guard Loader包.(官方地址:http://www.zend.com/en/product ...
- ParameterDirection参数类型
IDataParameter[] paramArray = new IDataParameter[]{ AdoHelper.GetParameter("ReturnValue",D ...
- luigi学习-luigi的配置文件
一.luigi配置文件的加载顺序 /etc/luigi/client.cfg luigi.cfg LUIGI_CONFIG_PATH环境变量 二.配置文件分节 配置文件被分为了多个section,每一 ...
- 启动hadoop报ERROR org.apache.hadoop.hdfs.server.namenode.FSImage: Failed to load image from FSImageFile
不知道怎么回事,今天在启动集群时通过jps查看进程时始终有一个standby namenode进程无法启动.查看日志时报的是不能加载fsimage文件.日志截图如下: 日志报的很明显了是不能加载元数据 ...
- RecyclerView的基本创建
线性显示 类似于listview: 线性宫格显示 类似于grid view: 用线性宫格显示 类似于瀑布流: 结构图: 测试代码: activity_main.xml: <RelativeLay ...