当程序运行时,有时会希望在程序中,只能存在一个实例,为了达到目的,所以设计了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. 改变placeholder的样式

    input::-webkit-input-placeholder{ font-size:12px; color:#d2d2d2 }

  2. layui关闭layer.open打开的页面

    var index = parent.layer.getFrameIndex(window.name); //获取窗口索引parent.layer.close(index);

  3. 部署静态页面到nginx

    1.将页面上传到某个位置.比如:/home/myapp/navi 2. server_name localhost;  localhost 更换为自己的域名 3.更改配置文件./usr/local/n ...

  4. bash之局部变量与子shell(转载)

    shell是每个接触linux.unix用户不得不会的工具,谈到shell就又联系到bash,因为这个shell是普遍被使用的.那么bash中的局部变量和子shell你是否能熟练掌握呢?这里推荐一本学 ...

  5. java web 自定义filter

    filter顾名思义,过滤器的意思,在javaweb中的Struts就利用了这种机制去实现视图和业务分离. 这里来配置下自己的Filter来理解下Struts的内在. 在web.xml 中添加下面: ...

  6. buildroot 修改root密码后无法登录ssh解决方法

    客户说想修改root密码后再登录ssh, 研究了一下,是因为ssh登录是匹配了之前的 密码生成文件,只要把之前的密码生成文件删除就可以. 过程如下: 删除 /etc/ssh/ssh_host*. rm ...

  7. Qt之QThreadPool和QRunnable

    简述 QRunnable 是所有 runnable 对象的基类,而 QThreadPool 类用于管理 QThreads 集合. QRunnable 类是一个接口,用于表示一个任务或要执行的代码,需要 ...

  8. Andriod——setContentView( )方法

    setContentView( )方法 setContentView(R.layout.main)在Android里面,这句话是什么意思? R.layout.main是个布局文件即控件都是如何摆放如何 ...

  9. Supervisor重新加载配置启动新的进程

    一.添加好配置文件后 二.更新新的配置到supervisord supervisorctl update 三.重新启动配置中的所有程序 supervisorctl reload 四.启动某个进程(pr ...

  10. git clone 故障 fatal could not create work tree dir

    问题如上图,原因是openWRT目录权限的问题,该目录是新创建的查看目录权限后发现该目录只对root有读写权限,对所有者及其他用户无读写权限.最简单的chmod 777 openWRT即可解决问题.