美文网首页
简单工厂模式

简单工厂模式

作者: CZKGO | 来源:发表于2018-07-23 09:43 被阅读0次

    简介

        简单工程模式属于创建者模式,提供工厂方法代替new操作,这样我们在创建对象时不会对调用者暴露创建逻辑,并且使用同一个接口来创建接口对象。

    优点

    • 调用简单,只需要指定目标便可创建对象(目标就是指名称,类型等)
    • 扩展简单,要增加一个产品,只需要扩展一个工厂类即可
    • 屏蔽产品具体实现,调用者只关心产品接口。

    缺点

    • 不符合开闭原则,每次增加一个产品,都需要增加一个产品类和工厂方法,就不得不修改工厂类,使得工厂类过于复杂。
    • 所有的创建逻辑处理都在工厂类中,但工厂类出了问题,整个系统就出了问题。

    实现

        先假设一个场景吧,最近长春长生的“疫苗”问题很受关注,有兴趣的百度一下,我们这里也不做评判,就拿疫苗来做个例子吧。

    第一步:创建疫苗接口Vaccine
    public interface Vaccine {
       void efficacy();
    }
    
    第二步:创建具体的疫苗类
    • 流感疫苗
    
    public class InfluenzaVaccine implements Vaccine {
     
       @Override
       public void efficacy() {
          System.out.println("预防流感");
       }
    }
    
    
    • 狂犬病疫苗
    
    public class RabiesVaccine implements Vaccine {
     
       @Override
       public void efficacy() {
          System.out.println("预防狂犬病");
       }
    }
    
    
    • 乙肝疫苗
    
    public class HepatitisBVaccine implements Vaccine {
     
       @Override
       public void efficacy() {
          System.out.println("预防乙肝");
       }
    }
    
    
    第三步:创建一个工厂,生成基于给定信息的实体类的对象。
    
    public class VaccineFactory {
       public static final int TYPE_ERRO = -1;
       public static final int TYPE_INFLUENZA = 0;
       public static final int TYPE_RABIES = 1;
       public static final int TYPE_HEPATITIS_B = 2;
       //使用 getVaccine 方法获取指定的疫苗对象
       public Vaccine getVaccine(int type){
          if(type == TYPE_ERRO){
             return null;
          }        
          if(type == TYPE_INFLUENZA){
             return new InfluenzaVaccine();
          } else if(type == TYPE_RABIES){
             return new RabiesVaccine();
          } else if(type == TYPE_HEPATITIS_B){
             return new HepatitisBVaccine();
          }
          return null;
       }
    }
    
    
    第四步:使用该工厂获取实例
    public class FactoryDemo {
     
       public static void main(String[] args) {
          VaccineFactory vaccineFactory = new VaccineFactory();
     
          //获取 InfluenzaVaccine 的对象,并调用它的 efficacy 方法
          Vaccine vaccine1 = vaccineFactory.getVaccine(VaccineFactory.TYPE_INFLUENZA);
          //调用 InfluenzaVaccine 的 efficacy 方法
          vaccine1.efficacy();
     
          //获取 RabiesVaccine 的对象,并调用它的 efficacy 方法
          Vaccine vaccine2 = vaccineFactory.getVaccine(VaccineFactory.TYPE_RABIES);
          //调用 RabiesVaccine 的 efficacy 方法
          vaccine2.efficacy();
     
          //获取 HepatitisBVaccine 的对象,并调用它的 efficacy 方法
          Vaccine vaccine3 = vaccineFactory.getVaccine(VaccineFactory.TYPE_HEPATITIS_B);
          //调用 HepatitisBVaccine 的 efficacy 方法
          vaccine3.efficacy();
       }
    }
    
    第五步:执行结果
    预防流感
    预防狂犬病
    预防乙肝
    

    相关文章

      网友评论

          本文标题:简单工厂模式

          本文链接:https://www.haomeiwen.com/subject/uyosuftx.html