上篇文章已经讲解了简单工厂模式,本文讲解工厂方法模式。
废话不多说直接上代码,感受下与简单工厂模式的不同。
产品接口类:
// 水果接口 - 产品接口
public interface Fruit {
// 获取该水果的名称
String getName();
}
产品接口实现类:
// 具体那种水果 - 产品实现
public class Apple implements Fruit {
private String name;
public Apple() {
this.name = "这是一个苹果";
}
@Override
public String getName() {
return name;
}
}
// ---------- 此处是两个java文件,为方便粘在一起了 -------------
public class Banana implements Fruit {
private String name;
public Banana() {
this.name = "这是一个香蕉";
}
@Override
public String getName() {
return name;
}
}
工厂接口类:创建生产特定类型产品的工厂类,让子类决定实例化哪个工厂,工厂方法使一个类的实例化延迟到了子类
// 工厂接口类,用于被具体的工厂类实现以生产产品
public interface FruitFactoryInter {
Fruit createFruit();
}
工厂接口实现类:实现工厂接口用以生产特定产品的工厂类
// 工厂实现类 - 该类生产苹果
public class AppleFruitFactory implements FruitFactoryInter {
@Override
public Fruit createFruit() {
return new Apple();
}
}
// -------------------
// 工厂实现类 - 该类生产香蕉
public class BananaFruitFactory implements FruitFactoryInter {
@Override
public Fruit createFruit() {
return new Banana();
}
}
客户端
// 购买水果的客户
public class Customer {
public static void main(String[] args){
// 该客户要了两种水果 每一种水果都有特定的工厂类获取
FruitFactoryInter fruitFactoryInter = new AppleFruitFactory();
Fruit fruit = fruitFactoryInter.createFruit();
System.out.println(fruit.getName());
fruitFactoryInter = new BananaFruitFactory();
fruit = fruitFactoryInter.createFruit();
System.out.println(fruit.getName());
}
}
类结构:
从上面可以明显看出,如果采用工厂方法模式实现简单工厂方法一文中所描述的问题,多了很多类,而且如果产品很多那么类的数量是成倍的增加,这样来说是不是工厂方法模式不好,其实在讲解简单工厂模式的时候已经说过简单工厂模式有个缺点那就是违背了开闭原则,而工厂方法模式的实现方式是产品类型的增加以及对于工厂类的增加,并不会修改原有的工厂和产品体系,这样就符合了开放-封闭原则。需要修改的地方由原来的工厂类变为现在的客户端,如果客户需要新的产品此处还是需要修改的。
总结:
1. 两种模式都是集中封装对象,都可以减低耦合性
2. 工厂方法模式可能会增大开发量
3. 解决了简单工厂模式违反开闭原则的弊端