Java设计模式之工厂模式

工厂设计模式,应该是java中使用比较频繁的一个模式,其主要目的就是解决复杂的对象,就比如我建了一个水果罐头的加工工厂,可以生产,草莓罐头,苹果罐头,凤梨罐头,黄桃罐头(博主单单喜欢黄桃罐头,难道是因为跟黄字挂钩?),如果没有使用工厂模式,那我是不是要草莓,苹果,凤梨,黄桃这四种罐头各做一个流水线?我勒个去,我TM去哪整这么多钱?我是商人讲究的是效益,收益远远小于投入,我还整哪门子钱去????
于是我就开始思考,先从洗果池开始(我是个有良知的商人),预煮,冷却,玻璃瓶消毒/杀菌,灌装这几个步骤都是生产水果罐头必须的操作,那么我就可以省去很大一部分钱,然后可以拿着这些钱做些慈善事业(太君是不会亏待我们滴).

以上就是工厂模式的一个简单介绍,下边我们可以开始利用工厂模式做一个简单的示例了,首先我们需要创建一个整体的

第一 先要缕清思路 明确生产罐头共同的流程

1.洗果
2.预煮
3.冷却
4.玻璃瓶消毒/杀菌
5.灌装

第二 我们先要有个罐头流水线代码如下

/**
 * 水果罐头
 * @author Richair_Ann
 */
public abstract class FruitCan {
  /**
   * 清洗干净
   */
  public abstract void toCleanClear();
  /**
   * 预煮
   */
  public abstract void precook();
  /**
   * 冷却
   */
  public abstract void cooling();
  /**
   * 消毒杀菌
   */
  public abstract void killGerms();
  /**
   * 灌装
   */
  public abstract void pouring();
}

第三 我们不可能每生产一瓶罐头就要创建一个流水线吧?为了省钱做慈善我也是费尽脑汁,我需要的就是我告诉你生产什么,你就可以立马动工,于是我将流水想抽取出来,就是下边这样

  /**
   * 某罐头的生产流水线
   * @author Richair_Ann
   *
   */
  public abstract class FruitFactory {
    /**
     * 我不管怎么生产水果罐头,你只需要告诉我想生产什么罐头即可
     * @param clz 具体的罐头类型
     * @return 返回一个你想生产的罐头
     */
  public abstract T createFruitCan(Class clz);
}

第四 下边我只需要将我需要生产的某一个罐头继承它就可以,下边是这样的

/**
 * 最后生产的罐头都大同小异,所以没必要一个一个的创建生产线,我只需要告诉你我要生产什么罐头你就可以给我做出来
 * 
 * @author Richair_Ann
 *
 */
public class FruitsFactory extends FruitFactory {
@Override
public  T createFruitCan(Class clz) {
    FruitCan fruitCan = null;
    try {
        fruitCan = (FruitCan) Class.forName(clz.getName()).newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return (T) fruitCan;
    }
}

下边我想生产草莓罐头和黄桃罐头 分别创建一个搭建一个流水线,只需要继承FruitCan即可

/**
 * 草莓
 * 
 * @author Richair_Ann
 *
 */
public class Berries extends FruitCan {
  @Override
  public void toCleanClear() {
    System.out.println("开始清洗草莓");
  }
  @Override
  public void precook() {
    System.out.println("开始预煮草莓");
  }
  @Override
  public void cooling() {
    System.out.println("将草莓冷却");
  }
  @Override
  public void killGerms() {
    System.out.println("对玻璃瓶进行杀菌消毒");
  }
  @Override
  public void pouring() {
    System.out.println("对草莓进行灌装");
  }
}


/**
 * 黄桃
 * 
 * @author Richair_Ann
 *
 */
public class YellowPeaches extends FruitCan {
  @Override
  public void toCleanClear() {
    System.out.println("开始清洗黄桃");
  }
  @Override
  public void precook() {
    System.out.println("开始预煮黄桃");
  }
  @Override
  public void cooling() {
    System.out.println("将黄桃冷却");
  }
  @Override
  public void killGerms() {
    System.out.println("对玻璃瓶进行杀菌消毒");
  }
  @Override
  public void pouring() {
    System.out.println("对黄桃进行灌装");
  }
}

下边开始测试

/**
 * 测试
 * 
 * @author Richair_Ann
 *
 */
  public class Test {
    public static void main(String[] args) {
      FruitsFactory factory = new FruitsFactory();
      Berries berries = factory.createFruitCan(Berries.class);
      berries.toCleanClear();
      berries.precook();
      berries.cooling();
      berries.killGerms();
      berries.pouring();
      System.out.println("-----------------------------");
      YellowPeaches yellowPeaches = factory.createFruitCan(YellowPeaches.class);
      yellowPeaches.toCleanClear();
      yellowPeaches.precook();
      yellowPeaches.cooling();
      yellowPeaches.killGerms();
      yellowPeaches.pouring();
    }
  }
Java设计模式之工厂模式_第1张图片
image.png

总结:工厂设计模式确实解决了不少重复性的工作,使得代码简洁了很多,但是也同样有它的确定,那就是我们每次创建新产品时都要编写新的产品类,还要引入抽象层,是代码结构过于复杂,在使用的时候需要我们权衡利弊,自行甄别使用!

你可能感兴趣的:(Java设计模式之工厂模式)