`
ysen
  • 浏览: 119317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

女友多的好处 (简单工厂模式)

阅读更多

java 的switch 语句的case 匹配为什么不能像delphi一样 支持String类型 哦

 

这里可以通过反射的话效果更佳

 

// 女友工厂

public class DreamGirlCreatFactory {
  
 
  public static DreamGirl creatDreamGirl(String girlName){
    
  if(girlName.equals("BeautifulGirl")){
   
   return new BeautifulGirl();
   
  }else if(girlName.equals("LivelyGirl")){
   
   
   return new LivelyGirl();
  } 
  else if(girlName.equals("LooksMediocreGirl")){
   
   return new LooksMediocreGirl();
   
  }else if(girlName.equals("SensibleGirl")){
   
   return new SensibleGirl();
   
  }
return null;
   
  
 } 
 public static void main(String[] args){
  
  String girlName1 = "BeautifulGirl";
  String girlName2 = "LivelyGirl";
  String girlName3 = "LooksMediocreGirl";
  String girlName4 = "SensibleGirl";
  
  String[] girlName = new String[4];
  girlName[0]=girlName1;
  girlName[1]=girlName2;
  girlName[2]=girlName3;
  girlName[3]=girlName4;
  
  for(int i=0; i<4;i++){
   
   DreamGirl girl = DreamGirlCreatFactory.creatDreamGirl( girlName[i]);
   girl.can_do_something_for_boy();
  }
  }
 

}


 

下面是创建的对象的 接口

//基类

public class DreamGirl {
 
 public void can_do_something_for_boy(){

 }

}

 

下面都是具体实现

 

public class BeautifulGirl extends DreamGirl {

  
 public void can_do_something_for_boy() {
  
   System.out.println("陪老公逛街!!!");
 }
 
 

}

 

 

public class LivelyGirl extends DreamGirl {

 
 public void can_do_something_for_boy() {
   
   System.out.println("陪老公聊天!!!");
 }
 
}

 

 

public class LooksMediocreGirl extends DreamGirl {
 
 public void can_do_something_for_boy() {
   
   System.out.println("给老公做饭!!!");
 }
 

}

 

 

public class SensibleGirl extends DreamGirl {
 
 public void can_do_something_for_boy() {
   
   System.out.println("给老公洗衣服!!!");
 }
 

}


 

分享到:
评论
18 楼 wujiazhao88 2009-12-10  
话说起来JAVA7怎么有点像C#了,支持string的switch了。。
17 楼 treblesoftware 2009-12-09  
zhao_xiao_dong 写道
我一直对工厂模式没有一个好的理解,它的意思何在?
小弟经验不太足,望高手给个好的答案,最好举个例子哈!


如果你代码到处使用new A();
此时,如果你的对象不叫A,叫A2。
那么,这个时候你的代码里只要有new A();的地方都修要修改成new A2();这样一来,你要修改很多地方,当然,现在IDE一般支持自动重构,设计模式是很多年前的东西了,那个时候没有这么聪明的IDE。另外,普通工厂作用不大,更多是面向接口的,或者是抽象的。
16 楼 zhao_xiao_dong 2009-12-09  
我一直对工厂模式没有一个好的理解,它的意思何在?
小弟经验不太足,望高手给个好的答案,最好举个例子哈!
15 楼 ysen 2009-12-09  
treblesoftware 写道
grunt1223 写道
jasonw 写道
意义何在? 解决了什么问题? 要添加新女友还必须修改factory....而且像其他人提出的那样,用string作这个是非常不好的。 要用enum. 可以参看effective java 1st/2nd edition.
不是用Pattern就好阿。。


恩,我的理解是,简单工厂主要是将散布在各处的对象创建过程统一到一个类当中,试想有多个类中都要用到这些女友,万一需要修改某个女友的具体实现,就不需要在各处代码中修改,只要在工厂里修改具体的实现即可。

PS:DI本质上也是工厂啊,只是它们帮你实现了


呵呵,工厂可以帮助你管理那些对象么?工厂只帮你生成对象。

管理对象spring不错
14 楼 treblesoftware 2009-12-09  
grunt1223 写道
jasonw 写道
意义何在? 解决了什么问题? 要添加新女友还必须修改factory....而且像其他人提出的那样,用string作这个是非常不好的。 要用enum. 可以参看effective java 1st/2nd edition.
不是用Pattern就好阿。。


恩,我的理解是,简单工厂主要是将散布在各处的对象创建过程统一到一个类当中,试想有多个类中都要用到这些女友,万一需要修改某个女友的具体实现,就不需要在各处代码中修改,只要在工厂里修改具体的实现即可。

PS:DI本质上也是工厂啊,只是它们帮你实现了


呵呵,工厂可以帮助你管理那些对象么?工厂只帮你生成对象。
13 楼 grunt1223 2009-12-09  
jasonw 写道
意义何在? 解决了什么问题? 要添加新女友还必须修改factory....而且像其他人提出的那样,用string作这个是非常不好的。 要用enum. 可以参看effective java 1st/2nd edition.
不是用Pattern就好阿。。


恩,我的理解是,简单工厂主要是将散布在各处的对象创建过程统一到一个类当中,试想有多个类中都要用到这些女友,万一需要修改某个女友的具体实现,就不需要在各处代码中修改,只要在工厂里修改具体的实现即可。

PS:DI本质上也是工厂啊,只是它们帮你实现了
12 楼 treblesoftware 2009-12-09  
ysen 写道
jasonw 写道
意义何在? 解决了什么问题? 要添加新女友还必须修改factory....而且像其他人提出的那样,用string作这个是非常不好的。 要用enum. 可以参看effective java 1st/2nd edition.
不是用Pattern就好阿。。

简单工厂有它的优点也有缺点,没有完美的单独的设计模式,只有完美的设计模式的组合,我在工厂方法模式中,已经将这两种模式进行了对比


说个不好听的话,当DI加入JDK的时候,工厂还需要么?
11 楼 ysen 2009-12-08  
jasonw 写道
意义何在? 解决了什么问题? 要添加新女友还必须修改factory....而且像其他人提出的那样,用string作这个是非常不好的。 要用enum. 可以参看effective java 1st/2nd edition.
不是用Pattern就好阿。。

简单工厂有它的优点也有缺点,没有完美的单独的设计模式,只有完美的设计模式的组合,我在工厂方法模式中,已经将这两种模式进行了对比
10 楼 whaosoft 2009-12-08  
lz实现的是工厂模式中的简单工厂
9 楼 水车老大 2009-12-08  
wangdgsc 写道
lz,你的女朋友多是多,不过都需要临时去找,不如先找好,放在那里,等要的时候直接去拿不更方便嘛,呵呵,而且这也有一个好处,一是一个可以一直的使用,而是多少有个限制,毕竟,到底是凡人嘛,不能太过了,差不多就好了,太多了会内在溢出


这时候是不是可以考虑建立一个 girl池啊
8 楼 jasonw 2009-12-08  
意义何在? 解决了什么问题? 要添加新女友还必须修改factory....而且像其他人提出的那样,用string作这个是非常不好的。 要用enum. 可以参看effective java 1st/2nd edition.
不是用Pattern就好阿。。
7 楼 ysen 2009-12-07  
wangdgsc 写道
lz,你的女朋友多是多,不过都需要临时去找,不如先找好,放在那里,等要的时候直接去拿不更方便嘛,呵呵,而且这也有一个好处,一是一个可以一直的使用,而是多少有个限制,毕竟,到底是凡人嘛,不能太过了,差不多就好了,太多了会内在溢出


这是简单工厂啦,你的要求应该是hankesi2000写到的抽象工厂方法嘿嘿
6 楼 wangdgsc 2009-12-07  
lz,你的女朋友多是多,不过都需要临时去找,不如先找好,放在那里,等要的时候直接去拿不更方便嘛,呵呵,而且这也有一个好处,一是一个可以一直的使用,而是多少有个限制,毕竟,到底是凡人嘛,不能太过了,差不多就好了,太多了会内在溢出
5 楼 ysen 2009-12-07  
hankesi2000 写道
建议LZ将每种类型的美女,再放到一个小的简单工厂里,然后把这些小工厂放到一个final的HashMap里,通过多态的方式处理,直接舍弃switch就行了。简单工厂如:
//接口:
public interface GirlFactory{
   DreamGirl creatDreamGirl();
}

  public class BeautifulGirlFactory implements GirlFactory{  

      public DreamGirl creatDreamGirl(){
          return new BeautifulGirl();
      }
  }


然后在DreamGirlCreatFactory 里放一个HashMap:
    private final Map map = new HashMap(){
      {
          put("BeautifulGirl",new BeautifulGirlFactory());
       }
    };

其他的美女跟这个类似,在使用时改为:
public static DreamGirl creatDreamGirl(String girlName){ 
    return map.get(girlName).creatDreamGirl();//可以做一些额外处理,在此简化
}



看起来感觉更好一些,只是比较复杂。。。

这个应该就是抽象工厂模式了
4 楼 hankesi2000 2009-12-07  
建议LZ将每种类型的美女,再放到一个小的简单工厂里,然后把这些小工厂放到一个final的HashMap里,通过多态的方式处理,直接舍弃switch就行了。简单工厂如:
//接口:
public interface GirlFactory{
   DreamGirl creatDreamGirl();
}

  public class BeautifulGirlFactory implements GirlFactory{  

      public DreamGirl creatDreamGirl(){
          return new BeautifulGirl();
      }
  }


然后在DreamGirlCreatFactory 里放一个HashMap:
    private final Map map = new HashMap(){
      {
          put("BeautifulGirl",new BeautifulGirlFactory());
       }
    };

其他的美女跟这个类似,在使用时改为:
public static DreamGirl creatDreamGirl(String girlName){ 
    return map.get(girlName).creatDreamGirl();//可以做一些额外处理,在此简化
}



看起来感觉更好一些,只是比较复杂。。。
3 楼 jltest 2009-12-07  
根据ls们总结

1.lz的例子更适合enum。
2.现在string可以作为case了。
2 楼 魔力猫咪 2009-12-06  
Java7就支持String作为Case了。
1 楼 oxromantic 2009-12-06  
enum 还不够吗

相关推荐

Global site tag (gtag.js) - Google Analytics