设计模式-单例模式(懒汉、饿汉)
来源:互联网 发布:南京雨花区网络问政 编辑:程序博客网 时间:2024/06/05 08:18
单例模式
应用:
日志,数据库等公用类
主要优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
(懒汉,线程不安全)
public class Singleton {
private staticSingleton instance;
private Singleton (){}
public staticSingleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
(懒汉,线程安全)
public class Singleton {
private staticSingleton instance;
private Singleton (){}
public staticsynchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
(饿汉)(php不能用)
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
(双重校验锁)
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
/* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数和析构函数必须声明为私有,防止外部程序new
* 类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法
* 以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。
* 使用单例模式生成一个对象后,
* 该对象可以被其它众多对象所使用。
*/
class Danli {
//保存类实例的静态成员变量
private static $_instance;
//private标记的构造方法
private function __construct(){
echo 'This is a Constructed method;';
}
//创建__clone方法防止对象被复制克隆
public function __clone(){
trigger_error('Clone is not allow!',E_USER_ERROR);
}
//单例方法,用于访问实例的公共的静态方法
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self;
}
return self::$_instance;
}
public function test(){
echo '调用方法成功';
}
}
//用new实例化private标记构造函数的类会报错
//$danli = new Danli();
//正确方法,用双冒号::操作符访问静态方法获取实例
$danli = Danli::getInstance();
$danli->test();
//复制(克隆)对象将导致一个E_USER_ERROR
//$danli_clone = clone $danli;
- Java设计模式之单例模式(懒汉/饿汉)
- 设计模式——单例模式(懒汉、饿汉)
- 设计模式-单例模式(懒汉、饿汉)
- 多线程-单例设计模式懒汉 饿汉
- 懒汉单例设计模式
- Android设计模式 单例模式(懒汉模式)
- 设计模式之单例设计模式(懒汉式)
- 设计模式之单例设计模式(饿汉单例设计模式&懒汉单例设计模式)
- 单例设计模式(C#) 懒汉模式
- 单例设计模式之懒汉模式
- 设计模式之单例模式:懒汉&饿汉
- 设计模式:java单例模式 懒汉&饿汉
- 设计模式--单例模式(三)改进型懒汉式
- 设计模式之单例模式(饿汉式,懒汉式)
- 单例模式(懒汉,饿汉)
- 单例模式(饿汉VS懒汉)
- 单例模式----懒汉+饿汉
- 单例模式(饿汉/懒汉)
- iOS学习笔记-OC篇(一)
- Gradle多版本打包
- 你的知识需要管理读书笔记
- 闭包与立即调用函数表达式IIFE 20170208
- C# Winform 跨线程更新UI控件常用方法总结(转)
- 设计模式-单例模式(懒汉、饿汉)
- 百度编辑器Ueditor 初始化加载内容失败解决办法
- mysql创建用户并授权
- 时间戳转换成24小时格式(2017-01-12 22:03:00)
- linux Makefile PHONY作用
- ora-01841 full year must be between -4713 and +9999
- 算法导论——快速排序
- 动态规划01背包与完全背包的C语言实现
- oracle timestamp和date