设计模式--单例模式
来源:互联网 发布:django 遍历数组前五个 编辑:程序博客网 时间:2024/06/06 09:27
定义:
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式的通用类图如下:
代码如下:
public class Singleton {
private static final Singleton singleton=new Singleton();
//私有的构造函数,限制产生多个对象
private Singleton(){
System.out.println("singleton is created");
}
public static Singleton getInstance(){
return singleton;
}
public void doSomething(){
System.out.println("Hello Singleton!");
}
}
这里需要注意几个地方:
1、要定义一个私有的静态的成员变量,并且在声明变量的时候就直接进行初始化,这样做是为了防止多线程操作而有可能出现的产生多个实例情况。
2、构造函数要定义成私有的,以限制产生多个对象。
3、要有一个静态的返回实例化后的成员变量的函数getInstance(),并且是公开的静态的,由类名进行调用。
单例模式的优点:
1、因为只有一个实例存在内存中,减少了内存的开支,特别是一个对象需要频繁的创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。
2、单例模式可以避免对资源的多重占用。
单例模式的缺点:
1、因为单例模式它要求“自行实例化”,所以一般没有接口,扩展很困难。
2、单例模式对测试是不利的,因为它没有接口,不能通过mock等方式虚拟一个对象。
单例模式的扩展:
如果要求一个类只产生两三个对象,该怎么办呢?来看一下类图:
代码如下:
public class MutiSingleton {
//定义最多能产生的实例数量
private static int maxNumOfSingleton=2;
//定义一个实例列表,存放生成的实例
private static ArrayList<MutiSingleton> singletons=new ArrayList<MutiSingleton>();
//当前实例的序列号
private static int countNumOfSingleton=0;
private MutiSingleton(){
}
//产生所有的实例
static{
for(int i=0;i<maxNumOfSingleton;i++){
singletons.add(new MutiSingleton());
}
}
public static MutiSingleton getInstance(){
Random random=new Random();
countNumOfSingleton=random.nextInt(maxNumOfSingleton);
return singletons.get(countNumOfSingleton);
}
}
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式的通用类图如下:
代码如下:
public class Singleton {
private static final Singleton singleton=new Singleton();
//私有的构造函数,限制产生多个对象
private Singleton(){
System.out.println("singleton is created");
}
public static Singleton getInstance(){
return singleton;
}
public void doSomething(){
System.out.println("Hello Singleton!");
}
}
这里需要注意几个地方:
1、要定义一个私有的静态的成员变量,并且在声明变量的时候就直接进行初始化,这样做是为了防止多线程操作而有可能出现的产生多个实例情况。
2、构造函数要定义成私有的,以限制产生多个对象。
3、要有一个静态的返回实例化后的成员变量的函数getInstance(),并且是公开的静态的,由类名进行调用。
单例模式的优点:
1、因为只有一个实例存在内存中,减少了内存的开支,特别是一个对象需要频繁的创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。
2、单例模式可以避免对资源的多重占用。
单例模式的缺点:
1、因为单例模式它要求“自行实例化”,所以一般没有接口,扩展很困难。
2、单例模式对测试是不利的,因为它没有接口,不能通过mock等方式虚拟一个对象。
单例模式的扩展:
如果要求一个类只产生两三个对象,该怎么办呢?来看一下类图:
代码如下:
public class MutiSingleton {
//定义最多能产生的实例数量
private static int maxNumOfSingleton=2;
//定义一个实例列表,存放生成的实例
private static ArrayList<MutiSingleton> singletons=new ArrayList<MutiSingleton>();
//当前实例的序列号
private static int countNumOfSingleton=0;
private MutiSingleton(){
}
//产生所有的实例
static{
for(int i=0;i<maxNumOfSingleton;i++){
singletons.add(new MutiSingleton());
}
}
public static MutiSingleton getInstance(){
Random random=new Random();
countNumOfSingleton=random.nextInt(maxNumOfSingleton);
return singletons.get(countNumOfSingleton);
}
}
0 0
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 设计模式-单例模式
- [设计模式] 单例模式
- 设计模式--单例模式
- 设计模式---单例模式
- 设计模式--单例模式
- 设计模式 -----单例模式
- 设计模式:单例模式
- Java中length,length()与size()的作用与区别
- Rails读书笔记第七章
- OXM框架-自主研发【支持xml转bean】【bean转xml】【通过注解即可使用哦】
- const的一些常用用法
- C/C++内存理解
- 设计模式--单例模式
- 关于EventBus的白话总结
- 在apache上安装gitweb实现浏览器访问git服务器
- mysql存储过程断点dbForge Studio for MySQL工具使用
- Magical Record
- android 获取版本号的方法(非Activity 类下也可以)
- 解决easyui中重复调用$.messager.progress('close')报错问题
- 编写 pwd
- Arcengine 注册命令(command)