您的位置:首页 > 其它

【设计模式】单例模式详解

2015-06-20 12:49 309 查看

前言

博主只是一名大三学生,文章内容难免有不足之处,欢迎批评指正。

 

正文

转载请注明出处: http://blog.csdn.net/h28496/article/details/46403815

发 表 时 间: 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 {

@Override
protected 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);
}

}


运行结果:



 

 

单例模式的优缺点

优点:

① 由于单例模式的对象只有一个实例,减少了内存开销。如果一个类,频繁的创建对象,会对性能有很大的影响。

② 单例模式可以避免对资源的重复占用。

缺点:

扩展困难。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息