当前位置:编程学习 > JAVA >>

设计模式之简单工厂模式

   提到工厂模式,有必要先说明下,工厂模式其实包含了三种模式:简单工厂模式、工厂方法模式和抽象工厂模式。其中,简单工厂模式并不属于GOF 23中设计模式中。先看下简单工厂模式。

简单工厂模式

意图

  一个工厂类根据传入的参量,动态决定应该创建出哪一个产品类的实例。

 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。

 模式结构及参与者

 


Factory:工厂角色
接受客户端的请求,通过请求负责创建相应的产品对象。

AbstractProduct:抽象产品角色
工厂模式所创建对象的父类或是共同拥有的接口。可以是抽象类或接口。

ConcreteProduct:具体产品角色
工厂模式所创建的对象都是这个角色的实例。
实例


[java] 
public void pay(String type){ 
  if(type.equalsIgnoreCase("cash")){ 
    //现金支付处理代码 
  }else if(type.equalsIgnoreCase("creditcard")){ 
    //信用卡支付处理代码 
  } 
  else if(type.equalsIgnoreCase("voucher")){ 
    //代金券支付处理代码 
  }else{ 
    …… 
  } 
}  
那么上述代码,我们可以看出,此段代码带有很多的判断逻辑,较为复杂,难以维护。下面对上述代码进行重构。

[java] 
public abstract class AbstractPay{ 
   public abstract void pay(); 
}  
[java] view plaincopy
public class CashPay extends AbstractPay{ 
   public void pay(){ 
    //现金支付处理代码 
  } 
}  
[java] 
public class PayMethodFactory{ 
    public static AbstractPay getPayMethod(String type){ 
    if(type.equalsIgnoreCase("cash")){ 
        return new CashPay();       //根据参数创建具体产品 
    } 
    else if(type.equalsIgnoreCase("creditcard")){ 
        return new CreditcardPay();   //根据参数创建具体产品 
    } 
    …… 
    } 
}  
效果
   简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建细节。

优点
1)将对象的创建和对象本身业务处理分离,可以降低系统的耦合度,使得两者修改起来都相对容易。
2)由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可。
缺点
简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。
模式应用场景
在JDK类库中广泛使用了简单工厂模式,如工具类java.text.DateFormat,它用于格式化一个本地日期或者时间。
[java] 
public final static DateFormat getDateInstance(); 
public final static DateFormat getDateInstance(int style); 
public final static DateFormat getDateInstance(int style,Locale locale); 
模式扩展
简单工厂模式的简化:在有些情况下,一个抽象产品类同时也是子类的工厂,也就是说把静态工厂方法写到抽象产品类中。

 
 


 

作者maritimesun
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,