博客信息

工厂模式Factory(创建模式)

发布时间:『 2019-03-21 23:44』  博客类别:23种设计模式  阅读(760)


  • 术语

    • Model 模型

    • Factory 模型工厂

  • 案例

    需求:一个披萨制作的项目,要求该项目易于扩展维护;

    1、能够生产出美式披萨、中式披萨...

    2、披萨制作过程包含原材料准备、烘培、切割、打包

    3、可生成披萨订单


小李飞刀_设计模式



  • 使用前

package com.javaxl.design.factory;

/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create  2020-02-21 21:29
*/
public interface Pizza {
  void pre();

  void bake();

  void cut();

  void box();
}

/**
* 中式披萨
*/
class ChinesePizza implements Pizza {

  public ChinesePizza() {
      this.pre();
      this.bake();
      this.cut();
      this.box();
  }

  @Override
  public void pre() {
      System.out.println("中式披萨材料准备...");
  }

  @Override
  public void bake() {
      System.out.println("中式披萨烘培...");
  }

  @Override
  public void cut() {
      System.out.println("中式披萨的切片...");
  }

  @Override
  public void box() {
      System.out.println("中式披萨包装盒包装");
  }
}

/**
* 美式披萨
*/
class AmericaPizza implements Pizza {
  public AmericaPizza() {
      this.pre();
      this.bake();
      this.cut();
      this.box();
  }

  @Override
  public void pre() {
      System.out.println("美式 披萨材料准备...");
  }

  @Override
  public void bake() {
      System.out.println("美式 披萨烘培...");
  }

  @Override
  public void cut() {
      System.out.println("美式 披萨的切片...");
  }

  @Override
  public void box() {
      System.out.println("美式 披萨包装盒包装");
  }
}

class JapanPizza implements Pizza {
  public JapanPizza() {
      this.pre();
      this.bake();
      this.cut();
      this.box();
  }

  @Override
  public void pre() {
      System.out.println("日式 披萨材料准备...");
  }

  @Override
  public void bake() {
      System.out.println("日式 披萨烘培...");
  }

  @Override
  public void cut() {
      System.out.println("日式 披萨的切片...");
  }

  @Override
  public void box() {
      System.out.println("日式 披萨包装盒包装");
  }
}


public class PizzaFactory {
  public static Pizza createPizza(int no){
      switch (no){
          case 1:
              return new ChinesePizza();
          case 2:
              return new AmericaPizza();
          case 3:
              return new JapanPizza();
      }
      return null;
  }
}


public class Client {
  public static void main(String[] args) {
      Pizza chinaPizza = PizzaFactory.createPizza(1);

      System.out.println("=============================");
      Pizza americaPizza = PizzaFactory.createPizza(2);

      System.out.println("=============================");
      Pizza japanPizza = PizzaFactory.createPizza(3);
  }
}

  • 使用后

package com.javaxl.design.factory.after;

/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create  2020-02-21 21:29
*/
public interface Pizza {
  void pre();

  void bake();

  void cut();

  void box();
}

/**
* 中式披萨
*/
class ChinesePizza implements Pizza {

  @Override
  public void pre() {
      System.out.println("中式披萨材料准备...");
  }

  @Override
  public void bake() {
      System.out.println("中式披萨烘培...");
  }

  @Override
  public void cut() {
      System.out.println("中式披萨的切片...");
  }

  @Override
  public void box() {
      System.out.println("中式披萨包装盒包装");
  }
}

/**
* 美式披萨
*/
class AmericaPizza implements Pizza {

  @Override
  public void pre() {
      System.out.println("美式 披萨材料准备...");
  }

  @Override
  public void bake() {
      System.out.println("美式 披萨烘培...");
  }

  @Override
  public void cut() {
      System.out.println("美式 披萨的切片...");
  }

  @Override
  public void box() {
      System.out.println("美式 披萨包装盒包装");
  }
}

class JapanPizza implements Pizza {

  @Override
  public void pre() {
      System.out.println("日式 披萨材料准备...");
  }

  @Override
  public void bake() {
      System.out.println("日式 披萨烘培...");
  }

  @Override
  public void cut() {
      System.out.println("日式 披萨的切片...");
  }

  @Override
  public void box() {
      System.out.println("日式 披萨包装盒包装");
  }
}



public class PizzaFactory {
  public static Pizza createPizza(int no){
      Pizza pizza = null;
      switch (no){
          case 1:
              pizza = new ChinesePizza();
              break;
          case 2:
              pizza = new AmericaPizza();
              break;
          case 3:
              pizza = new JapanPizza();
              break;
      }
      if (pizza == null){
          System.out.println("没有此披萨订购服务");
      }else {
          pizza.pre();
          pizza.bake();
          pizza.cut();
          pizza.box();
      }
      return pizza;
  }
}


public class Client {
  public static void main(String[] args) {
      Pizza chinaPizza = PizzaFactory.createPizza(1);

      System.out.println("=============================");
      Pizza americaPizza = PizzaFactory.createPizza(2);

      System.out.println("=============================");
      Pizza japanPizza = PizzaFactory.createPizza(3);

      System.out.println("=============================");
      Pizza otherPizza = PizzaFactory.createPizza(4);
  }
}

使用前后代码对比:

前者将对象初始化的工作交给了对象的构造函数完成;

后者将初始化的过程交给了工厂类完成;

这么做的好处在于解耦自身对象实例化和对象初始化动作,还有一个因素在于构造函数的初始化会影响到子类;

  • 注意事项及细节

    将对象的初始化交给工厂类 构造函数初始化会影响到子类,耦合度过高

  • 应用

    • 简单工厂

      xml建模 jdk源码中Calendar类

    • 抽象工厂

      Hibernate框架 Spring框架 Mybatis框架 Shiro框架


over......


关键字:     设计模式  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有