当程序运行时,有时会希望在程序中,只能存在一个实例,为了达到目的,所以设计了Singleton模式,即单例模式。

单例模式的特征:

  • 想确保任何情况下只存在一个实例
  • 想在程序上表现出只存在一个实例

示例程序:

  • Singleton单例类
package site.wangxin520.gof.singleton;

/**
* 单例模式获取单例对象的类
* @author wangXgnaw
*
*/
public class Singleton { //将创建出来的对象设为静态的私有对象
private static Singleton singleton=new Singleton();
//将构造方法私有化,不允许外部类中使用new 去创建对象
private Singleton(){}
//对外提供一个静态方法,获取到对象,因为对象是静态的私有属性
//所以是随着类的加载而加载的,并且只加载一次,这样一来,就只返回同一个对象了
public static Singleton getInstance(){
return singleton;
} }
  • Singleton单例测试程序
package site.wangxin520.gof.singleton;

/**
* 单例模式的测试类
* @author wangXgnaw
*
*/
public class SingletonTest { public static void main(String[] args) {
//使用getInstance获取实例化的方法,创建两个对象
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
//==双等号,在判断对象的时候,是比较对象的地址值,如果地址值为一样的话,那么就代表,单例模式创建成功。
if (s1==s2) {
System.out.println("单例模式创建成功");
}else {
System.out.println("单例模式创建失败");
} } }
  • 测试结果:

在单例模式中,需要注意的是,多线程情况下单例模式可能存在的问题,这里不做讨论。还有就是static关键字的用法——静态随着类加载而加载,且只加载一次。

补充一个测试练习题:

编写Triple类,实现最多只能生成三个实例,实例编号为0,1,2,并且可以通过getInstance(int id)方法来获取到该编号对应的实例:

  • Triple类
package site.wangxin520.gof.singleton;

import java.util.ArrayList;

public class Triple {

    //建立一个静态的数组,用于保存创建的实例
private static ArrayList<Triple> arr=new ArrayList<Triple>(); //属性id
private int id; //私有化构造函数
private Triple(){} //通过id去获取对应的实例
public static Triple getInstance(int id){
try{
//尝试从静态数组中获取,这里采用的是try catch接异常的方法
Triple triple = arr.get(id);
//如果数组中存在所需要的,那么就直接返回,否则抛异常
return triple;
}catch(Exception e){
//调用getInstance()方法进行操作
return getInstance();
}
} //没有参数,就不会造成异常的产生
public static Triple getInstance(){
//判断是否创建超过了3
if(arr.size()<3){
Triple t=new Triple();
t.id=arr.size();
arr.add(t);
return t;
}else{
//如果创建超过了3个,那么就返回第一个实例s
return getInstance(0);
}
} }
  • 测试类
package site.wangxin520.gof.singleton;

public class TripleTest {
public static void main(String[] args) { Triple t1 = Triple.getInstance();
Triple t2 = Triple.getInstance();
Triple t3 = Triple.getInstance();
Triple t4 = Triple.getInstance(); System.out.println(t1==t2);
System.out.println(t1==t3);
System.out.println(t1==t4);
System.out.println(t2==t3);
System.out.println(t2==t4);
System.out.println(t3==t4); }
}
  • 结果

可见t1和t4是相同的,因为超过三个了,就直接返回第一个,getInstance()方法正常

  • 测试2
package site.wangxin520.gof.singleton;

public class TripleTest {
public static void main(String[] args) {
Triple t1 = Triple.getInstance(0);
Triple t2 = Triple.getInstance(1);
Triple t3 = Triple.getInstance(2);
Triple t4 = Triple.getInstance(3);
System.out.println(t1==t2);
System.out.println(t1==t3);
System.out.println(t1==t4);
System.out.println(t2==t3);
System.out.println(t2==t4);
System.out.println(t3==t4); }
}
  • 结果

同样的,当想要获取编号不在0,1,2三个里面的话,就会返回第0个,所以t4和t1是相同的。

设计模式之Singleton模式的更多相关文章

  1. 【设计模式】Singleton模式C++实现

    Singleton是设计模式中比较简单的一个.园中的朋友们应该都很熟悉了.前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个.当时由于在有些地方考虑不太周全,代码出现了一些疏漏.不过最 ...

  2. 2)Javascript设计模式:Singleton模式

    Singleton模式 var User = (function() { var instance; function _User(){} _User.prototype.say = function ...

  3. 设计模式之Singleton模式和Strategy模式是什么

    Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方 ...

  4. 设计模式:singleton模式

    目的:限制类的实例个数只能是一个 例子: #define AGT_DECLARE_SINGLETON(ClassName) \ public: \ static ClassName *Instance ...

  5. 设计模式---对象性能模式之单例模式(Singleton)

    前提:“对象性能”模式  面向对象很好的解决了“抽象”的问题,但是必不可免地要付出一定的代价.对于通常情况来讲,面向对象的成本大都可以忽略不计.但是某些情况,面向对象所带来的成本必须谨慎处理. 前面是 ...

  6. Java设计模式(2)单态模式(Singleton模式)

    定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化 ...

  7. 设计模式之单件模式(Singleton Pattern)

    一.单件模式是什么? 单件模式也被称为单例模式,它的作用说白了就是为了确保“该类的实例只有一个” 单件模式经常被用来管理资源敏感的对象,比如:数据库连接对象.注册表对象.线程池对象等等,这种对象如果同 ...

  8. java设计模式3--单例模式(Singleton)

    本文地址:http://www.cnblogs.com/archimedes/p/java-singleton-pattern.html,转载请注明源地址. 单例模式 保证一个类仅有一个实例,并提供一 ...

  9. 设计模式(五)Singleton模式

    Singleton模式就是确保只生成一个实例的模式.这里有两个意思,即想确保任何情况下都绝对只有一个实例和想在程序上表现出“只存在一个实例”. 下面通过一个实例来说明这种设计模式. package B ...

随机推荐

  1. Lucene用法10个小结 (zhuan)

    http://www.cfanz.cn/index.PHP?c=article&a=read&id=303149 *********************************** ...

  2. Js 省市联动

    function cn(){ this.Items = {}; } cn.prototype.add = function(id,iArray){ this.Items[id] = iArray; } ...

  3. EF调用存储过程、函数

    一.ef4.1 codeFirst 修改表结构 增加字段等 EF code first需要重新生成库导致数据丢失的问题 说这个问题前 首先先说下 我使用ef4.1 codefirst的目的. 是因为可 ...

  4. haproxy+keepalived实现高可用负载均衡(转)

      软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. ...

  5. XmlFactoryBean和DefaultListableBeanFactory学习

    首先提供了一个Spring容器最简单的例子. bean的定义,MyTestBean.java public class MyTestBean { private String testStr = &q ...

  6. [usb]usb otg和host

    USB OTG 设备既能做主机,又能做设备.USB HOST是指主机.当OTG 插到 HOST 上,OTG 的角色 就是 device.当device 插到 OTG 上,OTG 的角色就是 HOST. ...

  7. netctl

    netctl is a CLI-based tool used to configure and manage network connections via profiles. It is a na ...

  8. pip和 easy_insall的区别

    作为Python爱好者,如果不知道easy_install或者pip中的任何一个的话,那么......   easy_insall的作用和perl中的cpan,ruby中的gem类似,都提供了在线一键 ...

  9. C语言 百炼成钢24

    /* 题目60:从键盘中输入一个不超过40个字符的字符串, 再输入3个位数(每次删除一个字符),删除对应 位数的字符,然后输出删除指定字符后的字符串. 输入:hellokityManGood 3 6 ...

  10. hive组件和执行过程

    转自http://blog.csdn.net/lifuxiangcaohui/article/details/40262021 对Hive的基本组成进行了总结: 1.组件: 元存储(Metastore ...