CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  Web 开发

工厂模式 实例化类

楼主lzmhehe(小飞飞)2006-06-01 08:56:16 在 Java / Web 开发 提问

一个类没有属性,但是在方法中存在变量    
  那么   我能否用工厂仅仅第一次生成一个对象    
  以后仅仅返回这个对象  
  这样能否出现线程不安全问题  
   
  工厂类  
   
  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

相关问题

关键词

得分解答快速导航

  • 帖主:lzmhehe
  • harston

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo