工厂设计模式
什么是工厂设计模式呢?我们从名字出发来理解,首先工厂就是生产产品的地方。比如电器工厂,在这个广场可以生产:空调,冰箱,洗衣机。这时,我们需要一台洗衣机来洗衣服。我们应该怎么做呢?当然是告诉厂长,我需要一台洗衣机,你给我生产一下。厂长说好的,没问题。这时候,我们就可以从工厂搬出一台洗衣机了。这样讲,大概明白工厂设计模式的作用了吧。
我们是程序员,所以需要回到代码层面来搞这个工厂设计模式。
第一步:我们需要创建四个对象:洗衣机对象、冰箱对象、空调对象和工厂对象。然后我们需要哪个对象,我们就去创造什么样的对象。
package cn.zl.factory;
// 工厂对象
public class Factory {
// 冰箱生产线
public IceBox getIceBox(){
return new IceBox();
}
// 空调生产线
public AirCondition getAirCondition(){
return new AirCondition();
}
// 洗衣机生产线
public Washer getWasher(){
return new Washer();
}
public static void main(String[] args) {
Factory factory = new Factory();
// 获取一台冰箱
IceBox iceBox = factory.getIceBox();
// 获取一台洗衣机
Washer washer = factory.getWasher();
// 获取一台空调
AirCondition airCondition = factory.getAirCondition();
}
}
class IceBox{
// 冰箱对象
}
class AirCondition{
// 空调对象
}
class Washer{
// 洗衣机对象
}
这样,差不多一个工厂设计模式就算是完成了。但是呢,我们又决定励志做一个优秀的程序员。这样的代码,看起来都像是小学生写的。而且,这个代码的扩展维护性不强。什么叫扩展维护性不强呢?就比如,冰箱行情不好,准备把冰箱线砍掉,换成手机线。我们是不是需要改的很多的地方呢?我们尝试的加入面向对象语言的三大特性中的,其中一特性,多态。来优化一下代码。
改装如下:
package cn.zl.factory;
// 工厂对象
public class Factory {
// 生产线
public Product getProduct(String productName) {
// 生产线
if (productName.equalsIgnoreCase("IceBox")) {
return new IceBox();
} else if (productName.equalsIgnoreCase("AirCondition")) {
return new AirCondition();
} else if (productName.equalsIgnoreCase("Washer")) {
return new Washer();
} else {
return null;
}
}
public static void main(String[] args) {
Factory factory = new Factory();
// 获取一台冰箱
Product iceBox = factory.getProduct("IceBox");
// 获取一台洗衣机
Product washer = factory.getProduct("Washer");
// 获取一台空调
Product airCondition = factory.getProduct("AirCondition");
}
}
interface Product {
// 产品接口
}
class IceBox implements Product {
// 冰箱对象
}
class AirCondition implements Product {
// 空调对象
}
class Washer implements Product {
// 洗衣机对象
}
这样写的话,就算我们的流水线,需要替换了,我们只需要把 if分支中的一部分,干掉或者替换掉。是不是很简单。我们这个demo过于简单,所有没有怎么体现出优化后的效果。假设一种情况,我们所有的产品都有一些共同的属性,我们第二中写法的优势,是不是就会凸显出来。我们只需要在接口中,定义就OK。
ps:是不是觉得工厂模式很简单,这就是所谓的工厂模式之一:简单工厂。后续其他的工厂模式,下篇文章见。
网友评论