老王讲设计模式(五)——工厂方法模式
工厂方法模式是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
![](https://img.haomeiwen.com/i1791020/126188f42595b23e.png)
临近过年了。公司内部一副等待放假的景象。
老王走近百无聊赖的小蔡问:“小蔡,过年准备怎么过呢?”
小蔡趴在桌子上,头也没抬,说:“准备去西藏净化一下心灵,顺带清洗一下我肺。”
老王说:“那就自驾呗,算我一个。咱们一起,路上也好有个照应。”
![](http://upload-images.jianshu.io/upload_images/1791020-51eff679b8f65b34.png)
小蔡抬起头,眨巴眨巴眼镜,说:“那咱们怎么去呢?自驾还是跟团呢?”
老王说:“当然自驾啦,自驾游才洒脱,才符合去西藏的情调啊。”
小蔡笑着说:“还情调呢~~请问老王,你买车了么?我可没车。我看你还是先把你的设计模式课程讲完,看领导能不能给你发点奖金,好让你去买个车。”
老王习惯性推了推眼镜说:“设计模式?好吧,正好我准备给大家讲讲工厂方法模式,在这之前,先讲给你听吧。”
小蔡点点头。
老王说:“工厂方法模式,我们可以简单的将其理解为根据不同的参数构造出不同实例。在工厂方法模式里,我们需要先确定这个工厂是生产什么东西的,也就是需要先定义出一个接口。比如我们想让工厂给我们造个车,我们就应该先定义出车是什么样的。”
//车
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();
}
}
老王接着说:“这下汽车造好了,市长可以开心的听喇叭声了。现在我总结一下,工厂方法模式的目的就是根据不同的参数创造出不同的实例。这个模式会有一个接口定义,若干接口实现类和一个工厂类。一般来说,工厂可以设计为单例的。”
![](http://upload-images.jianshu.io/upload_images/1791020-345320a48f09d0e8.png)
小蔡点点头,然后问:“这个例子我是懂了。可是我却想不出程序中,什么地方需要这样的模式。”
老王对小蔡竖了一个大拇指,说:“这个问题问得好,其实工厂方法模式和单例模式是十分常见的。比如我们一个项目中要连接不同的数据库,这时候我们就可以做一个连接工厂,根据我们传递进去的参数,构造出不同的连接。而且这个工厂往往就是单例的。”
![](http://upload-images.jianshu.io/upload_images/1791020-9ed5a7006bc4f775.png)
小蔡也对老王竖了一个大拇指,说:“恩,这下我明白了。下一次你又给我讲什么模式呢?”
老王说:“抽象工厂模式,如何?”
小蔡一脸疑惑:“抽象……工厂……?这是一个什么鬼?”
老王说:“要知道后面的内容啊,那你需要随时关注我才行咯。。。”
![](http://upload-images.jianshu.io/upload_images/1791020-416fcea80cae57c1.png)
更多内容,正在赶来,敬请关注“小蔡和老王的技术日常”。
PS:小蔡和老王的技术日常,已经建立QQ群,欢迎各位小伙伴通过发送简信的方式联系我们,询问QQ号。