当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 单例模式的基本用法

单例模式的基本用法 时间:2018-09-25      来源:未知

单例模式是众多设计模式中的一种,那说到设计模式,我们要想知道什么是设计模式?设计模式就是一套反复使用、多数人知晓的、经过分类、代码设计经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解,保证代码的可靠性。毫无疑问,设计模式已经已经于他人系统都是多赢的;设计模式是代码编程真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

其实简单来说,设计模式就是一种解决问题的思想,打个比方来说,我们想要盖一栋欧美风格的大楼,第一次盖,不是很懂,只能仿照欧美风格的大楼的样子去一点一点设计,一点一点完善,哪里出了问题,在设定方案,去一点一点的修改,终拿出一个好的方法来,而这个时候我们就将问题记录下来,包括如何去设计的这栋欧式风格的大楼。

如果后续还想要盖一栋欧式风格的大楼,我们是不是就不用在自己去一点一点摸索了?我们只需要拿出上一次人家盖大楼的设计方案,这样我们就可以避免了很多问题,因为在盖一栋大楼上面出现任何的问题都是致命的,而且造价也是很高的,所以我们就拿人家做好的解决方案来用,这也就是生活中就简单的,直白的设计模式的解释。

其实设计模式在我们现实生活中有很多,比如说我们去饭店吃饭,点了一个汤,服务员把汤端上来,我们直白的解决方案就是向服务员要喝汤的勺子,对吧?因为这个是解决我们不能将汤喝到嘴里简单有效的方式,还有很多的例子,在这里就不一一的列举了,那我们就说一下我们编程语言中的设计模式,同样,我们编程语言中的设计模式也是用来解决我们编程过程当中的一些问题,它不仅仅是能解决Java问题,所有的面相对象的语言都可以用我们的设计模式来解决问题,设计模式总共有20多种,分别用来解决不同的问题,同样我们今天要介绍的单例设计模式也是用来解决问题的,那它是用来解决什么问题呢?我们先从一个例子去入手看一下。

首先我创建一个Singleton类,里面只有定义了一个num属性。

class Singleton {

int num;

}

现在我要实例化两个Singleton类的对象,想做一件事,就是我ASingleton对象的num改变,想让BSingleton对象的num也随之改变,就是想让他们两个相互知道,一个改变了num另一个要知道。该如何去实现呢?有人说将num设置为静态,其实是可以解决这个问题的,但是设置为静态会有什么样的 小问题呢?就是我们的变量声明周期过长,如果数据量大呢?那么是不是就全部都要设置为静态,是不是不太合理?那么这个问题该怎么解决呢?

这个时候就用到了我们的单例模式,从名字上去理解,单个实例,对嘛,如果我们能保证这两个对象操作的是同一个实例,是不是就保证了它俩操作的都是同一个num?对的,就是这样,那么我们如何去保证对象的唯一性呢?首先我们要想,我们通过什么来创建对象呢?构造器吧?是的,那我们是不是不能让外部随意的去创建对象,如果还是能随便的创建,那我们怎么才能保证对象唯一性呢,怎么办呢?咱们想,如果我们将构造器私有化了,是不是外部就不能随意的去创建了?对嘛,外部都不能访问到你的构造器,它怎么去创建你的对象呢,是的,就是这样,那我们将构造函数私有化了,无法创建对象了也不行啊,是吧,那我们如何去操作数据呢?按照封装的思想,外部不能访问了,我内部去创建自身的对象可以不?我内部创建好一个自身的对象,在向外将我创建好的对象提供出去是不是就可以了,好了,基本的原理就是这样,接下来我将问题总结一下。

如何保证对象的唯一性:

1. 不允许其他程序用new 构造器 来创建该类的对象;

2. 在该类创建一个本类实例;

3. 对外提供一个方法让其他程序可以获取该对象。

步奏:

1. 私有化该类的构造函数;

2. 通过new 构造器 在本类当中创建一个本类的对象;

3. 定义一个共有的方法,将创建的对象返回出去。

这就是我们的基本步奏,下面我们在程序中去演示一下:

class Singleton {

int num;

private Singleton(){} //第一步:构造函数私有化

private static Singleton s = new Singleton(); //第二步:在本类中实例化该类的实例

public static Singleton getInstance(){ //第三步:向外提供一个方法,将创建好的该类实例返回出去

return s;

}

}

通过测试类看一下效果:

public static void main(String[] args) {

Singleton sing1 = Singleton.getInstance();

Singleton sing2 = Singleton.getInstance();

sing1.num = 10;

sing2.num = 20;

System.out.println("sing2.num="+sing1.num);

System.out.println("sing2.num="+sing2.num);

}

结果:

sing1.num=20

sing2.num=20

从结果我们就能看到,当后一次sing2改变了num,同时sing1的num也随之改变了,解释一下为什么要将第三步的方法设置为static,因为外部无法创建我们这个类的对象,所以我们将其提升为类级别,通过类名调用,当然static也有自己的规则,所以第二步也设置为了static,而前面加上private是我们的封装思想,同时我们可以在第三步中加入参数,做一个可控的判断,如果满足条件了我们才将实例给你用,不满足条件不给你用。

这个就是单例模式的基本用法。

 
 

上一篇:Linux内核编码规范

下一篇:图文解析u-boot2013.01启动流程

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部