设计模式之Singleton模式
当程序运行时,有时会希望在程序中,只能存在一个实例,为了达到目的,所以设计了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模式的更多相关文章
- 【设计模式】Singleton模式C++实现
Singleton是设计模式中比较简单的一个.园中的朋友们应该都很熟悉了.前段时间参加xxx外企的面试,和面试官讨论C++的时候正好写了一个.当时由于在有些地方考虑不太周全,代码出现了一些疏漏.不过最 ...
- 2)Javascript设计模式:Singleton模式
Singleton模式 var User = (function() { var instance; function _User(){} _User.prototype.say = function ...
- 设计模式之Singleton模式和Strategy模式是什么
Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方 ...
- 设计模式:singleton模式
目的:限制类的实例个数只能是一个 例子: #define AGT_DECLARE_SINGLETON(ClassName) \ public: \ static ClassName *Instance ...
- 设计模式---对象性能模式之单例模式(Singleton)
前提:“对象性能”模式 面向对象很好的解决了“抽象”的问题,但是必不可免地要付出一定的代价.对于通常情况来讲,面向对象的成本大都可以忽略不计.但是某些情况,面向对象所带来的成本必须谨慎处理. 前面是 ...
- Java设计模式(2)单态模式(Singleton模式)
定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化 ...
- 设计模式之单件模式(Singleton Pattern)
一.单件模式是什么? 单件模式也被称为单例模式,它的作用说白了就是为了确保“该类的实例只有一个” 单件模式经常被用来管理资源敏感的对象,比如:数据库连接对象.注册表对象.线程池对象等等,这种对象如果同 ...
- java设计模式3--单例模式(Singleton)
本文地址:http://www.cnblogs.com/archimedes/p/java-singleton-pattern.html,转载请注明源地址. 单例模式 保证一个类仅有一个实例,并提供一 ...
- 设计模式(五)Singleton模式
Singleton模式就是确保只生成一个实例的模式.这里有两个意思,即想确保任何情况下都绝对只有一个实例和想在程序上表现出“只存在一个实例”. 下面通过一个实例来说明这种设计模式. package B ...
随机推荐
- webapi应用架构详解
webapi适用场景 常见的应用包括以下四类,PC客户端程序,APP程序,网站程序,H5程序.这些应用需要的数据,服务可由同一个接口服务程序提供,这样,大大提高了产品多平台设计开发的效率,避免了重复的 ...
- django中ModelForm save方法 以及快速生成空表单或包含数据的表单 包含错误信息
django中ModelForm学习系列一~save方法 Model代码 from django.db import models # Create your models here. class P ...
- jquery autocomplete s.toLowerCase(); 对象不支持此属性或方法
今天发现了一个问题,自动提示删掉后再输入,会出现 s.toLowerCase(); 对象不支持此属性或方法的错误,后来格式化了jquery的autocomplete发现他是在matchSubset方法 ...
- 你真的需要一个jQuery插件吗
jQuery的插件提供了一个很好的方法,节省了时间和简化了开发,避免程序员从头开始编写每个组件.但是,插件也将一个不稳定因素引入代码中.一个好的插件节省了无数的开发时间,一个质量不好的插件会导致修复错 ...
- svn & git 问题汇总
svn: warning: W150002: '/Users/piercalex/svn/azzz/1' is already under version control svn: E200009: ...
- ubuntu 安装dlib 出现dlib.so: undefined symbol: png_set_longjmp_fn
参考网上的教程安装dlib 安装教程1 sudo apt-get install libboost-python-dev cmake sudo pip install dlib 安装教程2ubuntu ...
- 察看下列JSP内容
察看下列JSP内容 <html><body> <% for (int i=0;i<3;i++){ %> out.print(i*2); <% } %&g ...
- 关系运算符:instanceof
关系运算符:instanceof a instanceof Animal;(这个式子的结果是一个布尔表达式) a为对象变量,Animal是类名. 上面语句是判定a是否可以贴Animal标签.如果可以贴 ...
- 分享在github超酷超炫特效动画,不看你会懊悔的。
有图有真相直接上效果图,有须要的朋友们能够到连接上去下载. 下载地址:https://github.com/ChrisRenke/DrawerArrowDrawable 下载地址:https://gi ...
- Linux Shell Vim 经常使用命令、使用技巧总结
前言 本文总结了自己实际开发中的经常使用命令,不定时更新,方便自己和其它人查阅. 如有其它提高效率的使用技巧.欢迎留言. 本文地址 http://blog.csdn.net/never_cxb/art ...