设计模式之简单工厂模式

来源:互联网 发布:公司大数据 编辑:程序博客网 时间:2024/06/05 17:53

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

简单工厂模式 

意图

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

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

 模式结构及参与者

Factory:工厂角色

接受客户端的请求,通过请求负责创建相应的产品对象。

AbstractProduct:抽象产品角色

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

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

实例

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

public abstract class AbstractPay{   public abstract void pay();} 
public class CashPay extends AbstractPay{   public void pay(){    //现金支付处理代码  }} 
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,它用于格式化一个本地日期或者时间。
public final static DateFormat getDateInstance();public final static DateFormat getDateInstance(int style);public final static DateFormat getDateInstance(int style,Locale locale);
模式扩展
简单工厂模式的简化:在有些情况下,一个抽象产品类同时也是子类的工厂,也就是说把静态工厂方法写到抽象产品类中。