单实例和多实例的区别以及用途

1.单实例和多实例

单实例一般会在类中自己实例化,通过getInstance获取该实例。ps:

/**

* 单例模式

*/

public class Singleton {

private static Singleton singleton = new Singleton();

private Singleton() {}

public static Singleton getInstance() {

return singleton;

}

多实例则可以随意new。ps:

public class Multiton {

private static Multiton multi1 = new Multiton();

private static Multiton multi2 = new Multiton();

private Multiton() {}

public static Multiton getInstance(int key) {

if(key == 1) {

return multi1;

else {

return multi2;

}

}

/**

* 获取1—6之间的随机数

*/

public void getValue() {

int value = (int)(Math.random()*6+1);

System.out.println(value);

}

}

/**

* 多例模式测试

@author solid

*

*/

public class TestMultiton {

private static Multiton multi1;

private static Multiton multi2;

public static void main(String[] args) {

multi1 = Multiton.getInstance(1);

multi2 = Multiton.getInstance(2);

multi1.getValue();

multi2.getValue();

}

}

2. 为什么用单例、多例:
    之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
   之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
    用单例和多例的标准只有一个:
    当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;
3. 何时用单例?何时用多例?
    对于struts2来说,action必须用多例,因为action本身含有请求参数的值,即可改变的状态;
  而对于STRUTS1来说,action则可用单例,因为请求参数的值是放在actionForm中,而非action中的;
   另外要说一下,并不是说service或dao一定是单例,标准同第3点所讲的,就曾见过有的service中也包含了可改变的状态,同时执行方法也依赖该状态,但一样用的单例,这样就会出现隐藏的BUG,而并发的BUG通常很难重现和查找;

时间: 2024-11-08 21:25:04

单实例和多实例的区别以及用途的相关文章

spring 对象的单实例和多实例

(转载) 单例和多例的区别 : 单例多例需要搞明白这些问题:      1. 什么是单例多例:      2. 如何产生单例多例:      3. 为什么要用单例多例      4. 什么时候用单例,什么时候用多例:   1. 什么是单例.多例: 所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 单例模式和多例模式说明: 1. 单例模式和多例模式属于对象模式. 2. 单例模式的对象在整

mvc area区域和异步表单,bootstrap简单实例

码农最怕眼高手低 今天来练习mvc Area技术和bootstrap以及异步表单的C#代码实现. 1.area区域架构对于建立复杂业务逻辑很有帮助,由  AreaRegistration.RegisterAllAreas()方法遍历路由表,获得所有注册的路由.参见 建立类库Common,下设一个文件夹BookStore 在其中建立model和controller.(注意引用System.Web.Mvc这个dll) 项目结构如图: 其中book.cs为model模型 namespace Commo

单Tomcat的多实例配置原理及应用

转自 http://www.cher7.com/?id=12919 我们常有在JAVAWeb应用部署或依赖Tomcat应用中遇到单机多实例的需求,解决方案一般有: 1.复制Tomcat到不同目录,更改Server.xml等配置文件: 2.部署不同应用实例到webapps目录下或直接将多项目部署到同一Tomcat实例中. 以此解决多项目部署问题,不能说以上两种解决方案不对,只是这种解决思路有以下几个问题: 复制多Tomcat难于维护.两三个实例还好说,如果配置十个以上的实例,那对于统一启动.Tom

单例和多例的区别

单例和多例的区别 单例多例需要搞明白两个问题:1. 什么是单例多例:2. 如何产生单例多例:3. 为什么要用单例多例4. 什么时候用单例,什么时候用多例:1. 什么是单例.多例:所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action; 一.单例模式和多例模式说明: 1.         单例模式和多例模式属于对象模式. 2.         单例模式的对象在整个系统中只有一份,多例模式可以有多

MySQL系列之D-2------MySQL多实例添加一个实例

D-2.1   添加一个实例(3309实例) D-2.1.1.创建目录 # cd /data # mkdir 3309/data D-2.1.2.创建my.cnf文件在/data/3309 [client] port=3309 socket=/data/3309/mysql.sock prompt=\\[email protected] \\r:\\m:\\s-> [mysqld] basedir =/mysql datadir =/data/3309/data port =3309 serve

不可变实例、可变实例、copy与mutableCopy

代码: #import <Foundation/Foundation.h> // 不论一个实例是不可变实例还是可变实例 // 通过向该实例发送copy消息,得到的实例是不可变实例 // 通过向该实例发送mutableCopy消息,得到的实例是可变实例 // 在非ARC环境下 // 通过向实例发送copy或mutableCopy消息得到的实例需要手工调用release或autorelease方法 void stringCopy(void); void stringMutableCopy(void

SQL:安装多个实例,修改实例端口号,和IP加端口号连接实例

sql server 安装第一个实例,默认实例的端口是1433, 一个库中如果有多个实例,从第二个实例开始的端口是动态端口,需要的话,自己手工指定为静态端口,如指定第二个实例为1434 或着随意一个如2080端口 方法: 点击电脑左下方的“开始”->“Microsoft SQL Server2005”->“配置工具”->“SQL Server Configuration Manager”-> “展开网络配置” -->点击“MYSQLSERVER协议” --> 双击左侧新

Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本?

ylbtech-Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本? 1.返回顶部 1. Java 实例 - 如何查看当前 Java 运行的版本?  Java 实例 我们可以使用 -version 参数来查看当前 Java 的运行版本,命令如下: java -version 以上代码实例输出结果为: java version "1.6.0_13" Java(TM) SE Runtime Environment (build

Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件?

ylbtech-Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件? 1.返回顶部 1. Java 实例 - 如何执行编译过 Java 文件  Java 实例 本文我们演示如何执行编译过的 HelloWorld.java 文件,其中 Java 代码如下: HelloWorld.java 文件 public class HelloWorld { public static void main(String []args) { Syst