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

2018/08/10  |  from IT路  |  by 我是真老王  |  浏览 28

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

工厂模式-主图镇楼

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

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

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

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

老王脸红了

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

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

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

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

小蔡点点头。

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

//

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();

       }

}

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

市长 喜欢听喇叭声

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

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

老王竖起大拇指

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

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

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

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