单例模式在android中使用

单例模式(Singleton)

单例模式是对象的创建模式,单例模式能够确保某个类只有一个单一的实例对象存在,同时能够自行实例化并将单一的实例提供给外界调用的特点,其在实际项目开发中经常被用到。

单例模式的结构图说明如下:

结合上面的模式结构说明图,我们可以看到单例模式有几个显著的特点,具体如下所示:

A、单例类(Singleton)只能有一个唯一的实例存在。

B、单例类必须有能够自行创建自己的实例对象的能力。

C、单例类必须能够给外界其他对象提供这个实例。

另外,对于单例模式从产生到现在,也已经有了几种形式,下面我们就介绍几种常用到的形式(以代码的形式说明):

第一种形式:

/*

 * 单例模式---形式1

 */

public
class
SingletonA {

private
static final
SingletonA instance =
new SingletonA();

/* 私有构造子*/

private SingletonA() {

// CODE

}

/* 供外部调用的实例方法*/

public
static
SingletonA getInstance(){

return instance;

}

}

第二种形式:

/*

 * 单例模式---形式2

 */

public
class
SingletonB {

private
static
SingletonB instance =
null;

/* 私有构造子*/

private SingletonB() {

// CODE

}

/* 供外部调用的实例方法*/

public
static
SingletonB getInstance() {

if(null ==
instance) {

instance = new SingletonB();

}

return instance;

}

}

第三种形式:

/*

 * 单例模式---形式3

 */

public
class
SingletonC {

private
static
SingletonC instance =
null;

/* 私有构造子*/

private SingletonC() {

// CODE

}

/* 供外界调用的实例方法 这里用到了同步*/

public
static synchronized
SingletonC getInstance() {

if(null ==
instance) {

instance =
new
SingletonC();

}

return instance;

}

}

当然,在这里我只列出了比较常见到的几种形式的单例,下面来具体的分析下他们之间的联系和区别,并在最后举个实际的例子来使用单例模式。具体如下所示:

对于形式1的单例模式的特点就是在单例类自己被加载的时候就将自己实例化了。但从资源的利用率角度看的话,这种方式的实现会差一点;而第二种形式的单例模式是对第一种形式的小缺点做了优化,即在加载器加载单例类时不选择创建实例对象,只有在真正需要这个单例的时候才去创建唯一的实例;如果从时间和反应的速度看的话,那么形式1的单例要比形式2的要快些。对于形式3的单例,由于它使用了同步的机制,这样势必会降低它的性能,有利也有弊,它能够很好的在异步线程中保证实例的唯一性。

总的来说,形式1和形式2更符合Java机制,就我个人习惯于第二种形式的单例模式。下面具体举个例子来说明单例的使用,当然我使用自己习惯的单例模式形式。例子是这样的,在实际项目当中,我么会经常的要获取移动设备的屏幕宽和高,那么为了便于管理和统一,我们一般选择将获取宽和高的方法封装在一个单一的类中,同时为了避免重复的创建这个类,我们选择单例模式来实现。我的代码如下:

单例模式:

/* 单例类*/

public
class
PhoneUtil {

private
static
PhoneUtil instance =
null;

private
static
Context context =
null;

/* 私有的构造子*/

private PhoneUtil(Context ctx) {

context = ctx;

}

/* 供外部调用的实例化方法 保证创建唯一的实例对象*/

public
static
PhoneUtil getInstance(Contextctx) {

if(null ==
instance) {

instance =
new
PhoneUtil(ctx);

}

return instance;

}

/* 获得屏幕的宽度*/

public
int
getScreenWidth() {

Display display = ((WindowManager)

context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

return display.getWidth();

}

/* 获得屏幕的高度*/

public
int
getScreenHeight() {

Display display = ((WindowManager)

context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

return display.getHeight();

}

}

前端调用:

public
class
SingletonActivity extends Activity {

private
static
String TAG =
"SingletonActivity";

@Override

protected
void
onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_singleton);

int screenWidth = PhoneUtil.getInstance(this).getScreenWidth();

log("the screen width:" + screenWidth);

int screenHeight = PhoneUtil.getInstance(this).getScreenHeight();

log("the screen height:" + screenHeight);

}

private
void
log(String log) {

Log.d(TAG, log);

}

}

代码的运行效果:

从上面的图,我的手机的屏幕宽和高分别为320和480,看来分辨率和屏幕小的可怜了!

好了,到这里我们基本分析和使用了常用的单例模式。

技术交流群:179914858

时间: 2024-10-10 02:19:58

单例模式在android中使用的相关文章

设计模式实例学习-单例模式(Android中的使用场景)

1.设计模式实例-单例模式 单例模式,故名思议,是指在一个类中通过设置静态使得其仅创造一个唯一的实例.这样设置的目的是满足开发者的希望--这个类只需要被实例化创建一次,同时因为其为静态的缘故,加载的速度也应该快于正常实例化一个类的速度(理论上). 在Android开发中,当我们需要创建一个Fragment的时候常常会用到这样的模式,没有代码的学习是虚无的,接下来亮代码学习: public class SelectFrame extends Fragment { private final sta

单例模式在android中的应用

项目演示及讲解 爱奇艺  http://www.iqiyi.com/w_19rtfb03pp.html 土豆 http://www.tudou.com/programs/view/M1R6cIW15DY/ 项目下载 http://download.csdn.net/detail/u010134178/9052163 什么是单例模式 百度"java 单例" 以下是通过一个简单的列子来说明它的用户,别看这简单的例子,在公司项目里这可是最基本的呀 1.一个图片池类 public class 

android开发学习 ------- 【转】 android中的单例模式 (详解)

https://blog.csdn.net/u011418943/article/details/60139644     这篇文章 前因后果 都说出来了 ,值得学习. https://blog.csdn.net/nuobabijie730/article/details/52191150   单例模式在android中的实际使用 https://blog.csdn.net/Card361401376/article/details/51347184 原文地址:https://www.cnblo

Android中的单例模式

定义: 单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 使用场景: 确保某一个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个. UML类图: 单例模式几个关键点: 1.构造函数不对外开放,一般为private. 2.通过一个静态方法或者枚举返回单例类对象. 3.确保单例类的对象有且只有一个,尤其在多线程环境下. 4.确保单例类对象在反序列化时不会重新构建对象. 单例模式简单代码: public class Single

Java设计模式之单例模式及在Android中的重要使用

之前在开发中老用到一些设计模式可是呢又不是很懂,于是狠下心来琢磨一番.下面是我琢磨后总结的,希望对您有用.如果发现了问题,请帮忙指正. 一.单例模式是什么? 单例模式最初的定义出现于<设计模式>:"保证一个类仅有一个实例,并提供一个访问它的全局访问点." Java中单例模式定义:"一个类有且仅有一个实例,并且自行实例化向整个系统提供该实例." 二.为什么用单例模式? 对于系统中的某些类来说,只有一个实例很重要.例如,一个系统中可以存在多个打印任务,但是只

Android中的设计模式-单例模式

Android中的设计模式-单例模式 单例模式算是比较常用的模式,在Java中如果想要一个JVM中只存在某个类的一个实例,就需要使用到单例模式,而只存在一个实例的需求一般是因为: 1,对象实例比较大和复杂,创建开销很大. 2,只需要一个实例来维护整个功能的流程与交互. 例如Android中的电话应用启动时,对于单卡单待的电话,只创建一个Phone对象,用来管理RIL,CallTracker,ServiceStateTracker等对象,手机中不存在第二个Phone对象去和RILC通信. 类图 单

android中如何实现UI的实时更新---需要考虑电量和流量

1.如果不考虑电量和流量的话,只需要在对应的activity里面继承Runnable,在run方法里面写一个while死循环,调用接口返回数据,如果数据发生了变化,就立即更新UI 2.需要考虑电量的话,就是 远程服务器端  把消息 发送给客户端,客户端收到信息,去发一个广播,对应的activity收到广播就去更新UI,这个广播发出者就是一个后台service组件 类似的问题: ----------------------网上有个帖子,说了一个handler同时更新多个activity的界面,做法

从源码角度分析Android中的Binder机制的前因后果

前面我也讲述过一篇文章<带你从零学习linux下的socket编程>,主要是从进程通信的角度开篇然后延伸到linux中的socket的开发.本篇文章依然是从进程通信的角度去分析下Android中的进程通信机制. 为什么在Android中使用binder通信机制? 众所周知linux中的进程通信有很多种方式,比如说管道.消息队列.socket机制等.socket我们再熟悉不过了,然而其作为一款通用的接口,通信开销大,数据传输效率低,主要用在跨网络间的进程间通信以及在本地的低速通信.消息队列和管道

【转载】如何在Android中避免创建不必要的对象

在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用.这其中避免创建不必要的对象是一项重要的方面. Android设备不像PC那样有着足够大的内存,而且单个App占用的内存实际上是比较小的.所以避免创建不必要的对象对于Android开发尤为重要. 本文会介绍一些常见的避免创建对象的场景和方法,其中有些属于微优化,有的属于编码技巧,当然也有确实能够起到显著效果的方法. 使用单例 单例是我们常用的设计模式,使用这种模式,我们可以只提供一个对象供全局调用.因此单例