设计模式 -- 单例模式(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: ...
随机推荐
- IntelliJ IDEA 快捷键和设置
IntelliJ IDEA 使用总结 http://my.oschina.net/xianggao/blog/97539 IntelliJ IDEA 问题解决:1.乱码,主要是快捷键的字样显示乱码 中 ...
- mysql触发器关联表更新
mysql> create table voteItem -> ( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> titl ...
- libharu 源码编译 VS2010
最近项目中接过了一个libharu PDF 开源库的锅,哈哈.于是就自己编译了一套libharu 的MFC下的静态库和动态库. 编译libharu需要用到zlib库和libpng库,libpng库又依 ...
- Windows 2003 FastCgi安装环境
Windows 2003 IIS+PHP5.4.3 安装教程 一.准备相关组件 安装前,先安装IIS. 1.安装FastCgi for IIS6 Fastcgi官方网址是:http://www.iis ...
- responseXML 属性
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs ...
- .net IL 指令速查
名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...
- web.xml中常见配置解读
文章转自:http://blog.csdn.net/sdyy321/article/details/5838791 有一般XML都必须有的版本.编码.DTD <web-app>下子元素&l ...
- ViewPager中GridView问题
GridView 嵌套在ViewPager中问题. 1. GridView属性设置无法显示. 正常显示方式 <GridView android:padding="8dip" ...
- Oracle 直方图理论
一.何为直方图 直方图是一种几何形图表,它是根据从生产过程中收集来的质量数据分布情况,画成以组距为底边.以频数为高度的一系列连接起来的直方型矩形图,如图所示 二.ORACLE 直方图 在Oracle中 ...
- STM32F0xx_DMA收发USART数据配置详细过程
前言 关于DMA(Direct Memory Access)的功能,前面关注我微信的人应该知道,其实我已经在F1芯片上简单讲了一下.有网友要求在F0讲解一下使用DMA收发串口数据.今天就应网友要求总结 ...