单例模式,个人理解就是,使用了这个模式,可以保证一个类只生成唯一的实例对象。就是在整个程序中,这个类只存在一个实例对象。

GoF对单例模式的定义:保证一个类,只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。

客户端的代码用来测试,获取到的实例只有一个。直接上代码。

 public class MainClass {
public static void main(String[] args) {
Person person1=Person.getPerson();//获取Person对象
Person person2=Person.getPerson();//获取Person对象
person1.setName("Tom");
person2.setName("WhiteTaken");//如果两个获取的到的对象的实例,是同一实例,那么打印出来的名字应该是一样的。
System.out.println(person1.getName());
System.out.println(person2.getName());
}
}

如果不是单例模式,而仅仅是创建了几个对象 ,那么两次打印的结果,将会是两个不同的名字。

而单例模式的情况,获取的到的是同一个对象,那么两次打印的结果,将是第二次赋值的结果。

单例测试结果如下。

好,上面是测试结果,那么单例模式是怎么实现的呢。

我学习到的三种单例模式的创建方法。

1.直接用final方式创建。只要类执行,就会创建这样一个对象。

代码如下。

 public class Person {
private String name;
public static final Person perSon= new Person();//注意此处的final
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person(){ }
//获取对象的方法,final实现
public static Person getPerson(){
return perSon;
}
}

通过final关键字,保证perSon只被赋值一次,即值生成一次对象。

2.第二种方式,通过在获取对象的方法中判断person是否为null,如果不存在,则实例化person,如果存在,则直接返回person实例。

 public class Person2 {
private String name;
private static Person2 perSon;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person2(){ }
//获取对象的方法,单线程模式可用
public static Person2 getPerson(){
if(perSon==null){
return perSon=new Person2();
}
return perSon;
}
}

以上方法是实现单例模式的第二种方法,但是此种方法有一个天然的劣势,就是只适合单线程开发。

多线程的话,如果两个线程同时访问这个方法的话,返回的person对象可能会出现不一样的情况 ,那就不是单例了。

如果使用同步方法的话(synchronized),多线程的情况下会造成线程等待,影响效率。

3.第三种方式是通过双重检查的方式实现单例。

双重判断,通过两次判断null,能够确保在多线程下,只生成一个单例。

 public class Person4 {
private String name;
private static Person4 perSon;
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
//构造函数私有化
private Person4(){ }
//获取对象的方法,双重检查
public static Person4 getPerson(){
if(perSon==null){
synchronized (Person4.class) {
if(perSon==null){
return perSon=new Person4();
}
}
}
return perSon;
}
}

这样就完成单例模式的简单应用。

要想达到学以致用,真的很难,工作久了,很多东西都忘了。。。单例模式写的一个小例子,加强理解。

需要注意:只创建了一次对象。

  class Program
{
static void Main(string[] args)
{
Console.WriteLine("================测试单例模式=========begin======");
Test tst = GetAllTest.GetTest();
tst.TestPrint();
Test tst2 = GetAllTest.GetTest();
tst2.TestPrint();
Console.WriteLine("================测试单例模式=========end========");
Console.Read();
}
} class Test
{
public Test(){}
public void TestPrint()
{
Console.WriteLine("单例模式打印结果");
}
} class GetAllTest
{
private static Test ts;
public static Test GetTest()
{
if(ts == null)
{
Console.WriteLine("创建Test对象过程");
ts = new Test();
} return ts;
}
}

打印结果:

好好努力,提高自己!!!

(@WhiteTaken)设计模式学习——单例模式的更多相关文章

  1. java设计模式学习 ----- 单例模式(Singleton)

    单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式 ...

  2. GoF设计模式学习-单例模式

    1.目的 控制实例的个数,类设计者应该保证只有一个实例,不能将此责任[只有一个实例]强制交给类使用者. 2.整体实现 1.单线程单例模式的实现. using System; using System. ...

  3. java设计模式学习-单例模式

    java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供.”单例模式可以保证一个应用中有且只有一个实例,避免了资源的浪费和多个实例多次调用导致出错. 单例模式有以下特点: 1.单 ...

  4. C#设计模式学习笔记-单例模式随笔

    最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...

  5. C#设计模式学习笔记-单例模式(转)

    C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...

  6. Java设计模式学习笔记(五) 单例模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 使用单例模式的原因 以Windows任务管理器为例,在Windows系统中,任务管理器是唯 ...

  7. 【C++深入浅出】设计模式学习之单例模式

    但凡成为大家公认的模式,都是有一些不可小觑的威力,今天分享一个简单的设计模式:单例模式. 单例模式用于一些只希望有一个实例的类或者只希望执行一次的操作:校长只能有一个.老板只能有一个.用户点击弹窗只希 ...

  8. Java设计模式学习01——单例模式(转)

    原地址:http://blog.csdn.net/xu__cg/article/details/70182988 Java单例模式是一种常见且较为简单的设计模式.单例模式,顾名思义一个类仅能有一个实例 ...

  9. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

随机推荐

  1. Android L(5.0)源码之图形与图像处理之图形特效——Matrix

    最近在研究android 5.0的gallery模块,学习了相关的知识点,准备写点博客总结一下,有时间了会补充完整

  2. js中,怎么解决cookie里面中文乱码问题

    呵呵,我查了百度和谷歌,都没找到解决方案,但是,最终直接结合两个函数就可以了,哈哈哈,开心ing function getCookie(name) { var prefix = name + &quo ...

  3. ubuntu12.04+fuerte 下跑通lsd-slam——数据集

    lsd-slam(下载链接:https://github.com/tum-vision/lsd_slam)提供了两种方法,一种是用数据集(下载地址http://vision.in.tum.de/lsd ...

  4. VS2013 opencv2.4.8

    [转]http://my.phirobot.com/blog/2014-02-opencv_configuration_in_vs.html vs2010+opencv2.4.0:http://www ...

  5. VMWare虚拟机启动报错物理内存不足

    尝试了三种修改 1.说是微软补丁KB2995388冲突-->>失败 2.修改win8.1高级环境性能更改设置-->>失败 3.修改config.ini文件-->>成 ...

  6. SVN简明课程

    Reference: http://www.cnblogs.com/wangkangluo1/archive/2011/08/11/2135312.html 1. 版本控制介绍 1.1. 什么是版本控 ...

  7. ios framework 开发 之 实战二 ,成功

    1. 新建工程.引入cocoapod略过不提 2. 更改cocoapod类名 这是因为,引用framework的工程中,也有一个同样的文件,及文件里同样的类. 这个文件不能删除,但是可以重命名. 3. ...

  8. Js把IE COM数组列表转换成数组

    今天写组件的时候遇到一个问题,就是当我需要对获取到的对象列表进行删减的时候,发现没有合适的方法,比如: //获取图片列表 var imgs = document.getElementsByTagNam ...

  9. deviceOne -- js的本地搜索

    // 搜索 function search_by_PY(pinyin) { // 置空 var after_search_listData = []; // 清空数据 do_listData.remo ...

  10. java_web学习(2)Servlet

    软件编程体系 B\S 系统架构与C\S 系统结构 Web服务器         HTTP 协议:Web 浏览器与 web 服务器的交互所遵循的规则.         Web 服务器:Web服务器可以解 ...