设计模式-单例模式(懒汉、饿汉)
2017-02-10 11:17
357 查看
单例模式
应用:
日志,数据库等公用类
主要优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
(懒汉,线程不安全)
public class Singleton {
private static
Singleton instance;
private Singleton (){}
public static
Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
(懒汉,线程安全)
public class Singleton {
private static
Singleton instance;
private Singleton (){}
public static
synchronized
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;
应用:
日志,数据库等公用类
主要优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
(懒汉,线程不安全)
public class Singleton {
private static
Singleton instance;
private Singleton (){}
public static
Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
(懒汉,线程安全)
public class Singleton {
private static
Singleton instance;
private Singleton (){}
public static
synchronized
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设计模式之单例模式写法,懒汉,饿汉,双检锁
- Java设计模式中单例模式(Design Pattern):懒汉模式和饿汉模式
- 设计模式-单例模式懒汉和饿汉的比较
- 设计模式 之 单例模式 (C++ 懒汉经典实现 & DCL实现 & 饿汉经典实现)
- Java中的单例设计模式之饿汉模式、懒汉模式
- Java设计模式之单例模式(懒汉/饿汉)
- 设计模式-单例模式(Singleton Pattren)(饿汉模式和懒汉模式)
- 单例设计模式-懒汉饿汉
- 黑马程序员——单例设计模式,饿汉加懒汉
- 设计模式之单例设计模式(饿汉单例设计模式&懒汉单例设计模式)
- 单例设计模式(懒汉模式、饿汉模式)C++
- Java基础 - 单例(饿汉、懒汉),Runtime类,Timer,线程通信,互斥锁,线程组,线程五种状态,线程池,工厂模式,GUI,适配器设计模式
- 设计模式:单例模式,懒汉与饿汉
- 设计模式之单例模式:懒汉&饿汉
- 设计模式C++实现(4)——饿汉懒汉之单例模式