设计模式之简单工厂模式
提到工厂模式,有必要先说明下,工厂模式其实包含了三种模式:简单工厂模式、工厂方法模式和抽象工厂模式。其中,简单工厂模式并不属于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);
模式扩展
简单工厂模式的简化:在有些情况下,一个抽象产品类同时也是子类的工厂,也就是说把静态工厂方法写到抽象产品类中。
补充:软件开发 , Java ,