前言
博主只是一名大三学生,,文章内容难免有不足之处,欢迎批评指正。
正文
转载请注明出处:
发 表 时 间: 2015年6月20日
单例模式的定义
一个类有且仅有一个实例,并且自行实例化向整个系统提供。
单例模式有三个要点:
① 这个类只能有一个实例;
② 必须是自行创建这个实例;
③ 必须是自行向整个系统提供这个实例。
UML图:
单例模式的实现
假设一个场景:一个教师和一群学生在上课。学生可以问老师问题。教师类用单例模式实现。
Teacher.java
package zhp;/** * 教师类。 * @author 郑海鹏 * @since 2015年6月20日 */public class Teacher {// 一个私有的、静态的 实例private static Teacher teacher;// 私有的构造函数private Teacher(){};/** * 获得实例变量 */public static Teacher getInstance(){if(teacher == null){teacher = new Teacher();}// 返回唯一的实例return teacher;}/** * 回答学生的问题。 */public String answerQustion(String question){return "this is the answer!";}}
Student.java
package zhp;/** * 学生类。 * @author 郑海鹏 * @since 2015年6月20日 */public class Student {/** * 向老师提问。 */public void askTeacher(Teacher teacher, String question){System.out.println(teacher.answerQustion(question));}}
Client.java
package zhp;public class Client {public static void main(String[] args) {Student student = new Student();// 通过getInstance获得实例。student.askTeacher(Teacher.getInstance(), "this is a question!");test();}/** * 测试多次获得的实例是否为同一个实例。 */public static void test(){Teacher t1 = Teacher.getInstance();Teacher t2 = Teacher.getInstance();System.out.println("t1地址为:" + t1);System.out.println("t2地址为:" + t2);}}
输出结果:
总结
单例模式的核心,就是把构造函数私有化,对内创建一个实例,对外提供一个静态的方法获得实例。
单例模式在Android的应用
对于工具类来说,他们只需要一个实例就够了。因此,对于某些工具类,我们可以把它作为单例模式来实现。在这里,Utils_Bitmap是一个处理Bitmap的类。
Utils_Bitmap.java
package zhp.demo.singletonpattern;import android.graphics.Bitmap;import android.graphics.drawable.Drawable;public class Utils_Bitmap {// 单例private static Utils_Bitmap utils;// 私有的构造方法private Utils_Bitmap() {};/** * 供外界获得实例的方法 */public static Utils_Bitmap getInstance() {if (utils == null) {utils = new Utils_Bitmap();}return utils;}/** * 从文件中获得bitmap */public Bitmap getBitmapFromSD(String path){// 省略return null;}/** * 将bitmap转drawable的方法 */public Drawable getDrawableByBitmap(Bitmap bitmap) {// 省略return null;}/** * 将drawable转bitmap的方法 */public Bitmap getBitmapByDrawable(Drawable drawable) {// 省略return null;}/** * 让图片变暗的方法 */public void changeBitmapMoreDark(Bitmap bitmap) {// 省略}/** * 为图片加上水印的方法 */public void addWatermarkToBitmap(Bitmap bitmap) {// 省略}}
MainActivity.java
package zhp.demo.singletonpattern;import android.app.Activity;import android.os.Bundle;import android.view.ViewGroup;import android.widget.ImageView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获得背景ViewGroup view = (ViewGroup) findViewById(android.R.id.content);// 通过单例模式获得工具的实例Utils_Bitmap utils = Utils_Bitmap.getInstance();ImageView imageView = new ImageView(this);imageView.setImageBitmap(utils.getBitmapFromSD("/scard/a.png"));// 将imageView加进Activity的视图中view.addView(imageView);}}
运行结果:
单例模式的优缺点
优点:
① 由于单例模式的对象只有一个实例,减少了内存开销。如果一个类,频繁的创建对象,会对性能有很大的影响。
② 单例模式可以避免对资源的重复占用。
缺点:
扩展困难。
如果我们想要更多的玫瑰花,就必须种植更多的玫瑰树。