2007-07-05

(1)创建模式之工厂模式

关键字: 模式, pattern

Y 先生 和 Q女生结婚了,两个人组成了幸福的家庭... ...

现在,我们就来看看他们的家里都有哪些有趣的故事。

 


 

 

结婚后,家里的钱哪,贵重物品哪,都是由 Q 女生保管的。

这天,Y先生需要买一本书,但是Q女生不在家,所以他就私自拿了 100 元钱。当然,晚上他告诉Q女士了。

某一天,Y先生需要买一个钱包,恰巧Q女士还是不在家,所以他也是私自拿了100元钱。晚上也告诉Q女士了。

某天晚上,Q女士决定找Y先生谈一谈。

Q女士:你为什么总在我这拿钱而不告诉我?

Y先生:我也没办法呀,我也知道零零碎碎的拿那么多钱确实不太好记账。

Q女士:我决定改变这个方式,看看我下面的想法吧:

java 代码

 

  1. public class MoneyFactory {   
  2.      
  3.        
  4.     public static Money getMoney() {   
  5.            
  6.         return new Money();   
  7.     }   
  8.        
  9.        
  10. }  

 

Y先生:这个主意不错!可是,我每次拿的钱都不一样啊!

Q女士:这个容易,我修改一下:

java 代码

 

  1. public static Money getMoney(String reason) {   
  2.     
  3.     Money money = new Money();   
  4.     if(reason.equals("买书")) {   
  5.         money.setValue(80);   
  6.     } else if(reason.equals("钱包")) {   
  7.         money.setValue(100);   
  8.     } else {   
  9.         money.setValue(0);   
  10.     }   
  11.        
  12.     return money;   
  13. }  

 

Y先生:买书的钱似乎少了点。。。(不过Y先生突然发现,他只要多 getMoney 几次,就可以得到足够的钱了,嘿嘿,他是不会告诉Q女士这个诀窍的!)

 Y先生:可是老婆,有的时候我需要户口本,房产证什么的,因为有的时候一些地方需要这些证件。

Q女士:这很容易,你还是用这个,不过我得改一下名字:

java 代码

 

  1. public class ThingsFactory {   
  2.        
  3.     public static Money getMoney(String reason) {   
  4.            
  5.         Money money = new Money();   
  6.           
  7.         if(reason.equals("买书")) {   
  8.             money.setValue(80);   
  9.         } else if(reason.equals("钱包")) {   
  10.             money.setValue(100);   
  11.         } else {   
  12.             money.setValue(0);   
  13.         }   
  14.            
  15.         return money;   
  16.     }   
  17.        
  18.     public static Card getCard() {   
  19.            
  20.         return new Card();   
  21.            
  22.     }   
  23.            
  24. }  

 

Y先生:看起来不错,可是老婆,你知道,我买中文的书的时候,需要中国的银行卡和人民币,可是我买国外的书的时候,
               需要国外的银行卡和美元呢!

Q女士:你怎么这么烦呢!让我想想,如果都放到 ThingsFactory 里确实太乱了,好吧,我来改造一下:
               我们创建一个 Money 类,然后创建两个子类 RmbMoney 和 DollarMoney。
               我们再创建一个 Card 类,然后创建两个字类 ChinaCard 和 OtherCard 。
               当然我们还得创建一个抽象的工厂类,就叫 AbstractThingsFactory 吧!

java 代码

 

  1. public abstract class AbstractThingsFactory {   
  2.        
  3.     public abstract Money getMoney(String reason);   
  4.     public abstract Card getCard();   
  5.        
  6. }  

 

java 代码

 

  1. public class ChinaThingsFactory extends AbstractThingsFactory {   
  2.   
  3.     public Money getMoney(String reason) {   
  4.         Money money = new RmbMoney();   
  5.          
  6.         if(reason.equals("买书")) {   
  7.             money.setValue(80);   
  8.         } else if(reason.equals("钱包")) {   
  9.             money.setValue(100);   
  10.         } else {   
  11.             money.setValue(0);   
  12.         }   
  13.            
  14.         return money;   
  15.     }   
  16.   
  17.     public Card getCard() {   
  18.         return new ChinaCard();   
  19.     }   
  20.   
  21. }  

 

java 代码

 

  1. public class OtherThingsFactory extends AbstractThingsFactory {   
  2.   
  3.     public Money getMoney(String reason) {   
  4.            
  5.         Money money = new DollarMoney();   
  6.            
  7.         if(reason.equals("买书")) {   
  8.             money.setValue(40);   
  9.         } else if(reason.equals("钱包")) {   
  10.             money.setValue(50);   
  11.         } else {   
  12.             money.setValue(0);   
  13.         }   
  14.            
  15.         return money;   
  16.     }   
  17.   
  18.     public Card getCard() {   
  19.         return new OtherCard();   
  20.     }   
  21.   
  22. }  

 

Q女士:这下可以了吧!每一个工厂针对你每一种情况,以后别再烦我了。

Y先生:好,好。。。。。。买外国的书给钱就这么少啊。。。。

可是Y先生始终没告诉Q女士那个诀窍,所以,他总是有足够的钱去买东西 :)

而且,实际上,Y先生说买外国的书,他也只是说说而已,其实他从来没买过外国的书 :-)

评论
发表评论

您还没有登录,请登录后发表评论

yananay
搜索本博客
我的相册
D35bafa8-5bf0-475f-aa06-16f3080557a1-thumb
tdd
共 3 张
存档
最新评论