当程序运行时,有时会希望在程序中,只能存在一个实例,为了达到目的,所以设计了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. ilmerge工具合并多个DLL或EXE

    这是一个微软提供的合并多个DLL 或是将DLL合并进EXE的工具 首先下载这个工具:ilmerge http://www.microsoft.com/en-us/download/details.as ...

  2. 用wget做站点镜像

    用wget做站点镜像 -- :: 分类: LINUX # wget -r -p -np -k http://xxx.edu.cn -r 表示递归下载,会下载所有的链接,不过要注意的是,不要单独使用这个 ...

  3. tortoiseGit 如何github提交代码

    由于一直用的都是SVN提交代码,Git也是目前自己边学边用的,本来以为自己已经会用了,可是一段时间没用又忘了 ,所以赶紧整理整理记下来,以便日后使用! 转自:http://blog.csdn.net/ ...

  4. Oracle 11g安装图文攻略

    一.Oracle 下载 注意Oracle分成两个文件,下载完后,将两个文件解压到同一目录下即可. 路径名称中,最好不要出现中文,也不要出现空格等不规则字符. 官方下地址: http://www.ora ...

  5. 重启php

    注意这是重启php,不是重启apache service php-fpm restart

  6. 我为什么喜欢Go语言123123

    从2000年至今,也写了11年代码了,期间用过VB.Delphi.C#.C++.Ruby.Python,一直在寻找一门符合自己心意和理念的语言.我很在意写代码时的手感和执行的效率,所以在Go出现之前一 ...

  7. ResultSet是结果集对象

    ResultSet是结果集对象 DriverManager管理一组驱动程序 PreparedStatement预编译的,用来发送和执行SQL语句的

  8. UDP也需要现有Server端,然后再有Client端

    UDP编程: DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流. DatagramPacket(信件):数据包,是UDP下进行传输数 ...

  9. php -- 魔术方法 之 对象克隆 : __clone()

    产生对象的方法: 1.从类产生对象.new,通过new去堆区开辟一块内存空间 2.从对象产生对象.clone,通过关键字clone,将一个对象完整的复制一份,新开辟一块内存空间,将复制的结果存放到该内 ...

  10. MySQL--执行mysql脚本及其脚本编写

    http://www.cnblogs.com/kex1n/archive/2010/03/26/2286504.html