设计模式之简单工厂模式

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

简单工厂模式 

意图

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

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

 模式结构及参与者

设计模式之简单工厂模式_第1张图片

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);
模式扩展
简单工厂模式的简化:在有些情况下,一个抽象产品类同时也是子类的工厂,也就是说把静态工厂方法写到抽象产品类中。
设计模式之简单工厂模式_第2张图片









你可能感兴趣的:(设计模式,jdk,String,Class,扩展,产品)