工厂模式 实例化类
一个类没有属性,但是在方法中存在变量
那么 我能否用工厂仅仅第一次生成一个对象
以后仅仅返回这个对象
这样能否出现线程不安全问题
工厂类
package com.bonc.eba.module.hold.code.codeTable;
import java.util.*;
/**
*
* <p>Title: CodeTable的工厂 </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author
* @version 1.0
*/
public final class CodeTableFactory{
private static final String Show_HIGH = "HIG"; // 高端
private static final String Show_MIDDLE = "MID"; // 中端
private static final String Show_LOWER_MIDDLE = "ML"; // 准中
private static final String Show_GROUP = "GRP"; // 集团
private static HashMap hm = new HashMap();
private static CodeTable codetable = null;
/**
* 对创建的对象登记,以循环利用
* @param type String
* @return CodeTable
*/
private static synchronized CodeTable getCodeTable(String type){
if (hm.get(type) != null){
return (CodeTable) hm.get(type);
} else{
if (Show_HIGH.equalsIgnoreCase(type)) codetable = new CodeTableHig();
if (Show_MIDDLE.equalsIgnoreCase(type)) codetable = new CodeTableMid();
if (Show_LOWER_MIDDLE.equalsIgnoreCase(type)) codetable = new CodeTableML();
if (Show_GROUP.equalsIgnoreCase(type)) codetable = new CodeTableGrp();
hm.put(type,codetable);
return codetable;
}
}
/**
* 静态函数,通过传入的类型创建codetable对象.
*
* @param type
* @return
* @throws Exception
*/
public static final CodeTable createCodeTable(String type) throws Exception{
if (Show_HIGH.equalsIgnoreCase(type))return getCodeTable(Show_HIGH);
if (Show_MIDDLE.equalsIgnoreCase(type))return getCodeTable(Show_MIDDLE);
if (Show_LOWER_MIDDLE.equalsIgnoreCase(type))return getCodeTable(Show_LOWER_MIDDLE);
if (Show_GROUP.equalsIgnoreCase(type))return getCodeTable(Show_GROUP);
// if (Show_SINGLE.equalsIgnoreCase(type)) return new ShowS(dc, request);
throw new Exception("没有指定客户类型(集团、高端、中端、准中端...)。 ");
}
public static void main(String[] args){
try{
CodeTable ct1 = CodeTableFactory.createCodeTable("HIG");
CodeTable ct2 = CodeTableFactory.createCodeTable("HIG");
System.out.println("Class is null"+ct1==null);
System.out.println("HIG:" + ct1.equals(ct2));
ct1 = CodeTableFactory.createCodeTable("ML");
ct2 = CodeTableFactory.createCodeTable("ML");
System.out.println("ML:" + ct1.equals(ct2));
ct1 = CodeTableFactory.createCodeTable("MID");
ct2 = CodeTableFactory.createCodeTable("MID");
System.out.println("MID:" + ct1.equals(ct2));
ct1 = CodeTableFactory.createCodeTable("GRP");
ct2 = CodeTableFactory.createCodeTable("GRP");
System.out.println("GRP:" + ct1.equals(ct2));
} catch (Exception _ex){
_ex.printStackTrace();
}
}
}
其中的一个要实例的类
package com.bonc.eba.module.hold.code.codeTable;
/**
*
* <p>Title: 集团自己的表</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author
* @version 1.0
*/
public class CodeTableGrp
implements CodeTable{
/**
* 日志表
* @return String
*/
public String getLog(){
log=null;
。。。。。//这里根据情况给log 赋值
return log;
}
}
问题点数:20、回复次数:13Top
1 楼harston(顽石)(风停了,雨停了,一路泥泞~)回复于 2006-06-01 09:09:19 得分 0
工厂模式有几种,其中一种是抽象工厂,抽象工厂中只用你要用的类的接口或抽象类,当你实现具体的工厂的时候,你就可以把具体的类放进去了Top
2 楼lzmhehe(小飞飞)回复于 2006-06-01 12:38:19 得分 0
我要问的重点不是工厂模式有几种
而是一个没有属性但方法中存在变量,
能否共享一个实例 而不出现 线程问题Top
3 楼lzmhehe(小飞飞)回复于 2006-06-02 08:58:27 得分 0
自己顶
难道我说的不购明白么?Top
4 楼harston(顽石)(风停了,雨停了,一路泥泞~)回复于 2006-06-02 09:06:56 得分 0
只要你在不同的线程中引用了相同的变量都会产生线程的安全问题,
不晓得你是想控制到一个什么样的效果。Top
5 楼lzmhehe(小飞飞)回复于 2006-06-05 08:52:54 得分 0
为什么
我在action 中定义了一个类属性 HttpServletResponse request
而且没有使用任何线程技术
但是发现出现了 线程不同步的问题 request 丢失了Top
6 楼harston(顽石)(风停了,雨停了,一路泥泞~)回复于 2006-06-05 09:00:47 得分 0
因为struts的action是基于线程的,所以不能带类属性Top
7 楼greatest(成吉思汗)回复于 2006-06-05 09:29:05 得分 0
以上代码没什么问题。
action是基于线程,而且你在其中定义了类属性,因此会出现如下情况:
在不同的多个线程中会出现相同的变量,从而引发线程安全问题。
如果你要解决这个问题可以在具体实现实例时加入,但不能在类工厂里印入。或者是都在引用同一个变量则设置为共享变量Top
8 楼lzmhehe(小飞飞)回复于 2006-06-06 08:55:28 得分 0
为什么 把类属性(HttpServletResponse request) 拿到方法中 就不会出现 线程问题了Top
9 楼harston(顽石)(风停了,雨停了,一路泥泞~)回复于 2006-06-06 09:29:14 得分 20
lzmhehe(小飞飞) ( ) 信誉:100 2006-06-06 08:55:00 得分: 0
为什么 把类属性(HttpServletResponse request) 拿到方法中 就不会出现 线程问题了
1、如果你是在上面定义private static 同样会有问题,如果你的意思是在方法中定义一个属性,但是他不是类属性的话,就是说仅仅是一个方法中的实例变量的话,因为它每次实例化不同的对象,因此不会出现问题。
2、按照你这种原型模式实现方式,因为每次返回一个同一个对象,所以你连实例变量都不能要,只能出现在方法中实例变量,即局部变量Top
10 楼thisyear(小丑)回复于 2006-06-06 10:58:23 得分 0
...Top
11 楼lzmhehe(小飞飞)回复于 2006-06-06 17:01:07 得分 0
Action ActionA通过工厂 调用model ModA
ModA 没有类属性,只在方法中存在一些变量,但是这里变量会通过其他的方法
不同的用户会有不同的值
那么我能否使用工厂控制 ModA 的实例化 使返回给ActionA 的唯一一个实例 对象
这样 作会不会有什么问题Top
12 楼lzmhehe(小飞飞)回复于 2006-06-07 08:35:45 得分 0
harston(顽石)
帮帮忙啥Top
13 楼lzmhehe(小飞飞)回复于 2006-06-08 09:03:17 得分 0
自己顶Top




