设计模式之单例模式:
1、什么是设计模式?
设计模式(Design Pattern)是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验的总结。
例如盖房屋,在人们盖房屋的过程中,人们发现许多房屋盖起来的过程和房屋的风格都具有这样或那样很多相似的地方,所以在人们盖房屋的时候会参考过去盖过的房屋的经验,久而久之,形成了一种盖房屋的套路,这个套路就可以称之为设计模式。
2、设计模式的目的
对于程序员来说,使用设计模式可以提高代码的重用性、让代码更容易被别人理解、保证代码的可靠性。
3、什么是单例模式(Singleton)?
在程序开发过程中,有些对象我门只需要一个,如:配置文件、工具类、线程池、缓存、日志对象、游戏引擎中的导演等,如果创造多个实例,就会引发许多问题,比如:占用资源过多、不一致的结果等。举个例子:古代的皇帝,皇帝有且只能有一个,一山不容二虎,如果皇帝多了,就会出现各种问题。
怎么来保证整个应用中某个对象实例的创建只有一个呢?就需要采用单例模式的思想了。
4、Java实现单例模式
/* Singleton.java
* 单例模式Singleton
* 应用场合:有些对象只需要一个就足够了
* 作用:保证整个应用程序中某个实例有且只有一个
* 类型:饿汉模式
*/
public class Singleton {
//1、将构造函数设为私有,防止在类的外部创建类的对象实例
private Singleton(){
}
//2、创建唯一的对象实例,设置为private static,当类加载的时候实例也加载好
private static Singleton instance = new Singleton();
//3、获取实例的方法
public static Singleton getInstance(){
return instance;
}
}
/* Singleton2.java
* 懒汉模式
*/
public class Singleton2 {
//1、将构造函数设为私有,防止在类的外部创建类的对象实例
private Singleton2(){
}
//2、创建唯一的对象实例,设置为private static
private static Singleton2 instance;
//3、获取实例的方法
public static Singleton2 getInstance(){
if (instance == null){
instance = new Singleton2();
}
return instance;
}
}
/*
* Main.java
*/
public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1 == s2){
System.out.println("s1和s2是同一个实例");
}
else{
System.out.println("s1和s2不是同一个实例");
}
Singleton s3 = Singleton.getInstance();
Singleton s4 = Singleton.getInstance();
if (s3 == s4){
System.out.println("s3和s4是同一个实例");
}
else{
System.out.println("s3和s4不是同一个实例");
}
}
}
运行结果为:
s1和s2是同一个实例
s3和s4是同一个实例
上面就是单例模式的java实现的基本方法,从结果可以看到每个类只实例化了一个对象。
单例模式分为懒汉模式和饿汉模式,懒汉模式是在需要用到实例时才去实例化对象,所以加载类的时候速度较快,运行程序时获取对象速度较慢,饿汉模式是在加载类的时候就已经对对象进行实例化,所以加载类的时候速度较慢,运行程序时获取对象速度较快。这就是懒汉模式和饿汉模式的区别。
5、Cocos2d-x中的导演如何实现单例模式
源码如下:
public:
/** returns a shared instance of the director */
static Director* getInstance();
Director(void);
static DisplayLinkDirector *s_SharedDirector = nullptr;
Director* Director::getInstance()
{
if (!s_SharedDirector)
{
s_SharedDirector = new (std::nothrow) DisplayLinkDirector();
CCASSERT(s_SharedDirector, "FATAL: Not enough memory");
s_SharedDirector->init();
}
return s_SharedDirector;
}
从源码中可以发现,cocos2d-x采用的是懒汉模式,源码中将对象声明到全局,需要获取时再进行实例化,在构造函数上设置的权限是public,这点和上面java实现的不同,可能是因为在编程过程中没有哪个程序员会没事再去实例化一个导演。。。
(单例模式很简单,除了单例模式还有其他很多模式,貌似最基本的就有23个,瞬间感觉头大了。。。定一个设计模式分类,以后用到的时候或者闲的时候再总结学习吧、)