当程序运行时,有时会希望在程序中,只能存在一个实例,为了达到目的,所以设计了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. 通过web界面查看hadoop集群运行日志的地址

    通过web界面查看hadoop集群运行日志的地址: http://hostname:8088/logs/ SecurityAuth-root.audit 0 bytes  Aug 27, 2016 5 ...

  2. js in

    定义: in操作符用来判断某个属性属于某个对象,可以是对象的直接属性,也可以是通过prototype继承的属性.(参见hasOwnProperty) 注意事项: n         对于一般的对象属性 ...

  3. Java callback

    Java中的回调(callback)是很重要的一个概念,spring整合hibernate大量使用了这种技术. 究竟怎样才是回调呢? 这是网上最多见到的说明:     1.class   A,clas ...

  4. base64变形注入与联合查询注入的爱情故事

    先来写一下GET的知识点: 1.知道了convart函数(CONVERT函数是把日期转换为新数据类型的通用函数) 2.Illegal mix of collations for operation ' ...

  5. pictureBox

    private void pictureBox1_Click(object sender, EventArgs e) { openFileDialog1.Filter="*.jpg|*.jp ...

  6. Sql Server 语句集合

    -- 判断数据库表是否存在 select count(*) from sysobjects where id=OBJECT_ID('tableName'); -- 返回 1存在,0不存在 -- 判断表 ...

  7. 从文件/文件流的头字节中得到mime信息

    在写网络爬虫的时候,需要根据链接来获取文件类型,将内容正确存储.之前我都是根据链接的后缀来判断的,比如: http://img12.360buyimg.com/da/20120330/88_31_Zy ...

  8. 框架Iframe的退出,IE 火狐都没问题 到360就不跳转页面 刷新一遍才跳转到登录页

    遇到这种情况 ,郁闷死了,来回折腾好几种跳转方法,最后有一个灵感,当我点击退出按钮的时候,我是用jquery $("#ID").click(function(){}) 这种方法异步 ...

  9. word调整技巧

    a4纸如何留白: 

  10. 在Javascript弹出窗口中输入换行符

    private void showMessage(string strMsg) { Page.RegisterStartupScript("scriptStr", "&l ...