所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在。就像是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)的更多相关文章

  1. 单例模式——Java EE设计模式解析与应用

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

  2. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  3. 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...

  4. 单例模式——java设计模式

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

  5. Java设计模式の单例模式

    -------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...

  6. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

  7. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  8. Java基础知识之设计模式--单例模式

    Java设计模式--单例模式 声明:本文根据慕课网汤小洋老师的精品课程整理来的:慕课网 什么是设计模式(Design Pattern)? 设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设 ...

  9. 【设计模式】Java设计模式 - 单例模式

    [设计模式]Java设计模式 - 单例模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 分享学习心得,欢迎指正,大家一起学习成长! 原创作品,更多关注我CSDN: ...

随机推荐

  1. C语言文法 改

    <程序> ->  <外部声明> |  <程序>  <外部声明> <外部声明>  ->   <函数定义>  |  &l ...

  2. leetcode 107

    107. Binary Tree Level Order Traversal II Given a binary tree, return the bottom-up level order trav ...

  3. javascript之for-in循环(for-in Loops)

    for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”. 从技术上将,你可以使用for-in循环数组(因为JavaScript中数组也是对象),但这是不推荐的.因为如果数 ...

  4. leetcode1:在数组中找2个数的和正好等于一个给定值--哈希

    package java_net_test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; pu ...

  5. c#中Split函数的使用介绍

    平时经常用到split,在这里做一个系统的总结. Split函数  作用      返回一个下标从零开始的一维数组,它包含指定数目的子字符串.  语法       Split(expression[, ...

  6. ansible的playbook组件

    playbook的核心元素: tasks: 任务 variables: 变量 templates: 模板 handlers: 处理器 roles: 角色 组织格式:YAML(被称为另外一种标记语言) ...

  7. 第一节 MongoDB介绍及下载与安装

    引言 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类 ...

  8. 关于在javascript之中的时间格式;

    如何获取当前日期: function CurentTime() { var now = new Date(); var year = now.getFullYear(); //年 var month ...

  9. PHP 表单 - 验证邮件和URL

    PHP - 验证名称 以下代码将通过简单的方式来检测 name 字段是否包含字母和空格,如果 name 字段值不合法,将输出错误信息: $name = test_input($_POST[" ...

  10. WordPress 主题开发 - (十三) Archive模板 待翻译

    What archive.php does (and all its related templates) is show posts based on a select criteria. A da ...