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

前言

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

正文

转载请注明出处: 

发 表 时 间: 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);}}

运行结果:

单例模式的优缺点

优点:

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

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

缺点:

扩展困难。

如果我们想要更多的玫瑰花,就必须种植更多的玫瑰树。

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

相关文章:

你感兴趣的文章:

标签云: