单例(Singleton pattern)

来源:互联网 发布:1984为什么没被禁 知乎 编辑:程序博客网 时间:2024/05/11 00:20

适用范围:

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

java 简单例子:

public class SingletonClass{
    private static SingletonClass instance=null;
    public static SingletonClass getInstance(){
        if(instance==null){
            synchronized(SingletonClass.class){
                if(instance==null){
                    instance=new SingletonClass();
                }
            }
        }
        return instance;
    }
    private SingletonClass(){}
}

单例模式的类只提供私有的构造函数
含有一个该类的静态私有对象
提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象(通常由工厂式方法来创建)。

PHP版
class test {
//保存类实例的私有静态成员变量
private static $_instance;
//定义一个私有的构造函数,确保单例类不能通过new关键字实例化,只能被其自身实例化
private function __construct() {
echo 'test __construct';
}
//定义私有的__clone()方法,确保单例类不能被复制或克隆
private function __clone() {}
public static function getInstance() {
//检测类是否被实例化
if ( ! (self::$_instance instanceof self) ) {
self::$_instance = new test();
}
return self::$_instance;
}
}
//调用单例类
test::getInstance();

C++版
class CSingleton
{
private:
CSingleton() //构造函数是私有的
{
}
public:
static CSingleton * GetInstance()
{
static CSingleton *m_pInstance;
if(m_pInstance == NULL) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
};

OC

+(SingalClass*)shareInstance
{
//利用GCD创建一个单例模式
//第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数则是在整个应用程序中只会被调用一次的代码块。dispach_once函数中的代码块只会被执行一次,而且还是线程安全的。
static dispatch_once_t once;
dispatch_once(&once, ^{
single=[SingalClass alloc];
});
return single;
}


总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

其实还有两类:并发型模式和线程池模式。









0 0