概述
创建类模式主要关注对象的创建过程,将对象的创建过程进行封装,使客户端可以直接获得对象,而不用关心如何创建对象。创建类模式主要有5中:
1.单例模式:用于得到内存中唯一的对象。
2.工厂方法模式:用于创建复杂对象。
3.抽象工厂模式:用于创建一组相关或者相互依赖的复杂对象。
4.建造者模式:用于创建模块化的更加复杂的对象。
5.原型模式:用于得到一个对象的拷贝。
这篇博客主要是对单例模式的复习整理,大家肯定都有接触过,应该是比较常见的一种设计模式,当然也是最简单的一种设计模式了!我是做android的所以呢,会多注意一些单例模式在android中的使用!
定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例!
在android中使用单例模式的时候需要十分的注意内存泄露的问题!按我自己的理解内存泄露主要的一个原因就是持有对象的引用,而导致的GC无法回收的问题!
举个例子吧!如果单例模式中用到Context,传入某个Activity的对应的Context和Application的Context是由很大的区别的,由于单例模式一旦实例化,它在内存中存在的周期跟我们的应用的生命周期一样,所以当你传入Activity的context时,那么,这个Activity在关闭后是不会被系统的GC回收的,很明显就造成的内存泄露了!
单例模式根据实例化对象的时机不同可以分为两种:一种是饿汉式,一种是懒汉式。饿汉式会在单例类被加载的时候,就实例化一个对象交给自己使用;懒汉式则是在调用取得实例方法的时候才会实例化对象。当然,单例模式不止这两种,还有很多形式,只是这两种是当前比较流行的方式。
饿汉式:
懒汉式:
单例模式的优点:
1.在内存中只有一个对象,节省内存空间;
2.避免重复的创建对象,提供了运行性能;
3.可以全局访问;
使用注意事项:
1.只能使用单例类提供的方法得到单例对象,不要使用反射,否则会实例化一个新的对象。
2.多线程使用单例共享资源的时候,注意线程安全问题。
3.不要做断开单例对象与类中静态引用的危险操作。
关于java中单例模式的争议:
单例模式对象长时间不被使用是否会被jvm垃圾集器收集吗?
之前写这篇博客的时候,查资料看到有不少文章介绍说,长时间不用这个单例模式对象的时候,会被jVM当成垃圾,清理掉!在我个人看来,除非你做断开单例对象与类中静态引用的操作,否则JVM是不会回收单例模式的对象的(暂时还未想到程序验证的方法)。
那同一个JVM有没有可能会产生多个单例模式对象呢?
嗯,是可以的,你可以使用反射的方式,这样每次运行的时候会产生新的单例对象。所以单例对象必须慎用反射。
那单例模式是否可以被继承呢?
前边也说了,单例模式有多种多样的写法实现,但是对于饿汉式和懒汉式的单例模式是不能被继承的,因为它的构造函数是私有的。但是有些单例模式是可以被继承的,比如说登记式单例模式。
OK,就扯到这!如有问题欢迎大家留言交流!
每天进步一点点,时间会让你成为巨人!加油!
参考书籍:
《android设计模式》
最后
以上就是含糊白昼为你收集整理的设计模式之创建型模式(1)--单例模式的全部内容,希望文章能够帮你解决设计模式之创建型模式(1)--单例模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复