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

前言

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

 

正文

转载请注明出处: 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);
	}
	
}


运行结果:


 

 

单例模式的优缺点

优点:

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

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

缺点:

扩展困难。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值