设计模式之创建型模式(1)--单例模式

创建类模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户端可以直接获得对象,而不用关心如何创建对象。创建类模式主要有5中:
1.单例模式:用于得到内存中唯一的对象。
2.工厂方法模式:用于创建复杂对象。
3.抽象工厂模式:用于创建一组相关或者相互依赖的复杂对象。
4.建造者模式:用于创建模块化的更加复杂的对象。
5.原型模式:用于得到一个对象的拷贝。

这篇博客主要是对单例模式的复习整理,大家肯定都有接触过,应该是比较常见的一种设计模式,当然也是最简单的一种设计模式了!我是做android的所以呢,会多注意一些单例模式在android中的使用!

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例!

在android中使用单例模式的时候需要十分的注意内存泄露的问题!按我自己的理解内存泄露主要的一个原因就是持有对象的引用,而导致的GC无法回收的问题!

举个例子吧!如果单例模式中用到Context,传入某个Activity的对应的Context和Application的Context是由很大的区别的,由于单例模式一旦实例化,它在内存中存在的周期跟我们的应用的生命周期一样,所以当你传入Activity的context时,那么,这个Activity在关闭后是不会被系统的GC回收的,很明显就造成的内存泄露了!

单例模式根据实例化对象的时机不同可以分为两种:一种是饿汉式,一种是懒汉式。饿汉式会在单例类被加载的时候,就实例化一个对象交给自己使用;懒汉式则是在调用取得实例方法的时候才会实例化对象。当然,单例模式不止这两种,还有很多形式,只是这两种是当前比较流行的方式。

饿汉式:
设计模式之创建型模式(1)--单例模式

懒汉式:
设计模式之创建型模式(1)--单例模式

单例模式的优点:
1.在内存中只有一个对象,节省内存空间;
2.避免重复的创建对象,提供了运行性能;
3.可以全局访问;

使用注意事项:
1.只能使用单例类提供的方法得到单例对象,不要使用反射,否则会实例化一个新的对象。
2.多线程使用单例共享资源的时候,注意线程安全问题。
3.不要做断开单例对象与类中静态引用的危险操作。

关于java中单例模式的争议:
单例模式对象长时间不被使用是否会被jvm垃圾集器收集吗?

之前写这篇博客的时候,查资料看到有不少文章介绍说,长时间不用这个单例模式对象的时候,会被jVM当成垃圾,清理掉!在我个人看来,除非你做断开单例对象与类中静态引用的操作,否则JVM是不会回收单例模式的对象的(暂时还未想到程序验证的方法)。

那同一个JVM有没有可能会产生多个单例模式对象呢?
嗯,是可以的,你可以使用反射的方式,这样每次运行的时候会产生新的单例对象。所以单例对象必须慎用反射。

那单例模式是否可以被继承呢?
前边也说了,单例模式有多种多样的写法实现,但是对于饿汉式和懒汉式的单例模式是不能被继承的,因为它的构造函数是私有的。但是有些单例模式是可以被继承的,比如说登记式单例模式。

OK,就扯到这!如有问题欢迎大家留言交流!

每天进步一点点,时间会让你成为巨人!加油!

参考书籍:
《android设计模式》