Java World架构算法设计模式和编程理论互联网从业者的日常

老王讲设计模式(五)——工厂方法模式

2017-01-24  本文已影响908人  大树林里的小树

工厂方法模式是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。

工厂模式-主图镇楼

临近过年了。公司内部一副等待放假的景象。

老王走近百无聊赖的小蔡问:“小蔡,过年准备怎么过呢?”

小蔡趴在桌子上,头也没抬,说:“准备去西藏净化一下心灵,顺带清洗一下我肺。”

老王说:“那就自驾呗,算我一个。咱们一起,路上也好有个照应。”

老王脸红了

小蔡抬起头,眨巴眨巴眼镜,说:“那咱们怎么去呢?自驾还是跟团呢?”

老王说:“当然自驾啦,自驾游才洒脱,才符合去西藏的情调啊。”

小蔡笑着说:“还情调呢~~请问老王,你买车了么?我可没车。我看你还是先把你的设计模式课程讲完,看领导能不能给你发点奖金,好让你去买个车。”

老王习惯性推了推眼镜说:“设计模式?好吧,正好我准备给大家讲讲工厂方法模式,在这之前,先讲给你听吧。”

小蔡点点头。

老王说:“工厂方法模式,我们可以简单的将其理解为根据不同的参数构造出不同实例。在工厂方法模式里,我们需要先确定这个工厂是生产什么东西的,也就是需要先定义出一个接口。比如我们想让工厂给我们造个车,我们就应该先定义出车是什么样的。”

//车
public interface Vehicle {
  //是个车,就能鸣笛
  void blow();
}

老王接着说:“现在我们再定义三种类型的车,一种是吉普车,一种是小轿车,还有一种是公交车。他们都实现车这个接口。”

//公交车
public class Bus implements Vehicle {
  @Override
  public void blow() {
    System.out.println("公交车的喇叭声:嘟~~嘟~~");
  }
}

//吉普车
public class Jeep implements Vehicle {
  @Override
  public void blow() {
    System.out.println("吉普车的喇叭声:叭~~叭~~");
  }
}

//小轿车
public class Car implements Vehicle {
  @Override
  public void blow() {
    System.out.println("小轿车的喇叭声:嘀~~嘀~~");
  }
}

//车辆类型枚举
public enum VehicleType {
  JEEP,
  BUS,
  CAR
}

小蔡好奇的问:“说了这么多,那工厂呢?”

老王回答:“别着急,工厂马上就来,工厂的作用是能根据我们的需求创造出不同的车。所以工厂应该是像下面这个样子。 ”

//汽车工厂
public class VehicleFactory {
  //制造汽车
  //客户要吉普,就造个吉普
  //客户要公交,就造个公交
  //客户要小轿车,就造个小轿车
  //客户要其他汽车,造不出来,因为这个工厂只会造吉普车,小轿车和汽车
  public Vehicle make(VehicleType type){
    Vehicle vehicle = null;
    switch(type){
      case JEEP:
        vehicle = new Jeep();
        break;
      case BUS:
        vehicle = new Bus();
        break;
      case CAR:
        vehicle = new Car();
        break;
    }
    return vehicle;
  }
}

老王说:“这下工厂有了,车的设计图纸有了,就等市长下令,安排造车了。”

//市长
public class Mayor {
  public static void main(String[] args) {
    //市长说,修个汽车制造厂吧
    VehicleFactory factory = new VehicleFactory();

    //市长说,我喜欢去西藏,那就造吉普车吧,吉普车越野性能好
    Vehicle jeep = factory.make(VehicleType.JEEP);
    //吉普车造出来后,按按喇叭,先听声音爽一下
    jeep.blow();

    //发现吉普车太费油,改造小轿车
    Vehicle car = factory.make(VehicleType.CAR);
    //小轿车造出来后,按按喇叭,先听声音爽一下
    car.blow();

    //汽车太多,雾霾来了,改造公交和大巴,提升公共交通
    Vehicle bus = factory.make(VehicleType.BUS);
    //大巴造出来后,按按喇叭,先听声音爽一下
    bus.blow();
  }
}

老王接着说:“这下汽车造好了,市长可以开心的听喇叭声了。现在我总结一下,工厂方法模式的目的就是根据不同的参数创造出不同的实例。这个模式会有一个接口定义,若干接口实现类和一个工厂类。一般来说,工厂可以设计为单例的。”

市长喜欢听喇叭声

小蔡点点头,然后问:“这个例子我是懂了。可是我却想不出程序中,什么地方需要这样的模式。”

老王对小蔡竖了一个大拇指,说:“这个问题问得好,其实工厂方法模式和单例模式是十分常见的。比如我们一个项目中要连接不同的数据库,这时候我们就可以做一个连接工厂,根据我们传递进去的参数,构造出不同的连接。而且这个工厂往往就是单例的。”

老王竖起大拇指

小蔡也对老王竖了一个大拇指,说:“恩,这下我明白了。下一次你又给我讲什么模式呢?”

老王说:“抽象工厂模式,如何?”

小蔡一脸疑惑:“抽象……工厂……?这是一个什么鬼?”

老王说:“要知道后面的内容啊,那你需要随时关注我才行咯。。。”

老王/小蔡求打赏

更多内容,正在赶来,敬请关注“小蔡和老王的技术日常”。
PS:小蔡和老王的技术日常,已经建立QQ群,欢迎各位小伙伴通过发送简信的方式联系我们,询问QQ号。

上一篇下一篇

猜你喜欢

热点阅读