上篇我们提到了为了更好地解耦,我们引入了简单工厂设计模式。
但是简单工厂模式还存在问题,就是一个工厂不是万能的,我们不能要求一个工厂既生产这个,又生产那个。
为解决这个问题,我们来学习一下工厂方法设计模式。
简单地说,工厂方法就是把生产不同品牌的工厂分离开来,一个工厂专注于生产一个品牌,生活化些,就是我们不能要求一个鞋厂既生产耐克,又生产阿迪达斯,耐克和阿迪达斯应该是两个分开的工厂。
好的,下面我们来写代码:
还是上次我们用的面包的例子,我们首先看一下面包类的代码:
public interface Bread {
void eat();
}
//此处的DanXiang为面包品牌
public class DanXiangBread implements Bread {
@Override
public void eat() {
System.out.println("我在吃丹香面包");
}
}
//此处的桃李为面包品牌
public class TaoLiBread implements Bread{
@Override
public void eat() {
System.out.println("我在吃桃李面包");
}
}
然后开始写工厂类,此处于简单工厂不同的是,简单工厂只有一个工厂,这个简单工厂既生产桃李面包,又生产丹香面包。而此处将生产桃李面包的工厂和生产丹香面包的工厂分离开来,这就使桃李工厂专注于生产桃李面包,丹香工厂专注于生产丹香面包,下面来看代码:
工厂接口:
public interface Factory {
Bread makeBread();
}
桃李面包工厂:
public class TaoLiBreadFactory implements Factory {
@Override
public Bread makeBread() {
return new TaoLiBread();
}
}
丹香面包工厂:
public class DanXiangBreadFactory implements Factory {
@Override
public Bread makeBread() {
return new DanXiangBread();
}
}
好了,我们来写一个测试类测试一下:
public class Test {
public static void main(String[] args) {
Factory taoLiBreadFactory = new TaoLiBreadFactory();
Bread bread = taoLiBreadFactory.makeBread();
bread.eat();
}
}
我们可以看到,工厂方法设计模式将生产不同品牌面包的工厂分离开来,这样可以使一个工厂专注于一个品牌的特色,代码层面说,代码可以更好地解耦。
但是,工厂方法也有他的不足之处,我们来仔细看一下测试类的代码:
我们可以看到,我们为了得到桃李面包,首先要new一个TaoLiBreadFactory的实例。反映在现实生活中就是,消费者为了吃一个桃李面包,首先要到桃李面包厂去;想要吃一个丹香面包,又要到丹香面包厂去。显然这是不合理的。反映到代码中就是,客户端程序员要得到一个实例,首先要new一个生产该实例的方法,这无疑增加了客户端程序员代码的复杂度。
为了解决这个问题,抽象工厂设计模式产生了。