单例模式

单例模式概念

单例模式是设计模式中最简单的形式之一。在它的核心结构中只包含一个被称为单例类的特殊类。
通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

单例模式的特点

一个类在整个应用中只有一个实例
类必须自行创建这个实例
必须自行向整个系统提供这个实例
 

单例模式的实现条件

1、单例模式的类只提供私有的构造函数
2类定义中含有一个该类的静态私有对象
3、该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
4、私有化克隆函数,防止外界克隆对象 【针对php的 __clone() 魔术方法】
 
各种语言的实现例子:
1、php
  1.  1 <?php  
     2 class Singleton  
     3 {  
     4     /** 
     5      * Description:(1)静态变量,保存全局实例,跟类绑定,跟对象无关 
     6      *             (2)私有属性,为了避免类外直接调用 类名::$instance,防止为空 
     7      */  
     8     private static $instance;  
     9       
    10     /** 
    11      * Description:数据库连接句柄 
    12      */  
    13     private $db;  
    14       
    15     /** 
    16      * Description:私有化构造函数,防止外界实例化对象 
    17      */  
    18     private static function __construct()  
    19     {  
    20     }  
    21       
    22     /** 
    23      * Description:私有化克隆函数,防止外界克隆对象 
    24      */  
    25     private function __clone()  
    26     {  
    27     }  
    28       
    29     /** 
    30      * Description:静态方法,单例访问统一入口 
    31      * @return Singleton:返回应用中的唯一对象实例 
    32      */  
    33     public static function GetInstance()  
    34     {  
    35         if (!(self::$instance instanceof self))  
    36         {  
    37             self::$instance = new self();  
    38         }  
    39         return self::$instance;  
    40     }  
    41       
    42     /** 
    43      * Description:获取数据库的私有方法的连接句柄 
    44      */  
    45     public function GetDbConnect()  
    46     {  
    47         return $this->db;  
    48     }  
    49 }  
    View Code
java的Singleton模式主要作用是:保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有三种形式:
 
第一种形式:懒汉式,也是常用的形式。
 1 public class SingletonClass{
 2     private static SingletonClass instance=null;
 3     public static SingletonClass getInstance()
 4     {
 5         if(instance==null)
 6         {
 7                instance=new SingletonClass();
 8         }
 9         return instance;
10     }
11     private SingletonClass(){
12     }
13 }
View Code
 
第二种形式:饿汉式
 
  1.  1 //在java中,我们不能用static修饰顶级类(top level class)。
     2 //只有内部类可以为static
     3 public static class Singleton{
     4     //在自己内部定义自己的一个实例,只供内部调用
     5     private static final Singleton instance = new Singleton();
     6     private Singleton(){
     7         //do something
     8     }
     9     //这里提供了一个供外部访问本class的静态方法,可以直接访问
    10     public static Singleton getInstance(){
    11         return instance;
    12     }
    13 }
    View Code

第三种形式: 双重锁的形式
这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了
  1. public static class Singleton{
        private static Singleton instance=null;
        private Singleton(){
            //do something
        }
        public static Singleton getInstance(){
            if(instance==null){
                synchronized(Singleton.class){
                    if(null==instance){
                        instance=new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    View Code

 
C++的单例模式实例
  1.  1 class CSingleton
     2 {
     3     private:
     4     CSingleton() //构造函数是私有的
     5     {
     6     }
     7     public:
     8     static CSingleton * GetInstance()
     9     {
    10         static CSingleton *m_pInstance;
    11         if(m_pInstance == NULL) //判断是否第一次调用
    12             m_pInstance = new CSingleton();
    13         return m_pInstance;
    14     }
    15 };
    View Code

 





原文地址:https://www.cnblogs.com/lovelp/p/singleton_pattern.html