1、定义
为某个对象提供一个接口,而且无需指定它们的具体类。
工厂方法模式,是简单工厂模式的延伸(https://blog.csdn.net/ss1300460973/article/details/84984688),简单工厂模式中,每出现一个新的产品(或实现),都要修改工厂类,这违背了开闭原则。所以工厂方法通过将创建产品的实现延迟到子类,解决了这个问题。但这带来了新的问题,就是每出现一个新的产品,就要增加新的产品类实例,开发成本变高;并且,客户端又重新需要关心创建哪个工厂的问题。
简单来说,工厂方法模式的好处就是,扩展方便了,因为抽象工厂一旦创建好,就可以复用了。
2、实现
用工厂方法模式实现一个水果工厂,由工厂生产水果:
1)创建抽象水果类,创建具体的某种水果类;
2)创建抽象水果工厂,创建具体的某种水果子工厂;
3)调用方调用水果子工厂生成水果。
// 抽象水果类
public abstract class Fruit {
String name;
public Fruit(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// 一个具体水果类
public class Apple extends Fruit {
public Apple(String name) {
super(name);
}
}
// 一个具体水果类
public class Banana extends Fruit {
public Banana(String name) {
super(name);
}
}
// 抽象水果工厂
public interface IFruitFactory {
public Fruit getFruit();
}
// 苹果工厂,专门生产苹果
public class AppleFactory implements IFruitFactory {
@Override
public Fruit getFruit() {
return new Apple("apple");
}
}
// 香蕉工厂,专门生产香蕉
public class BananaFactory implements IFruitFactory {
@Override
public Fruit getFruit() {
return new Banana("Banana");
}
}
// 调用方
public class Eat {
public static void main(String[] args) {
IFruitFactory fruitFactory = new AppleFactory();
Fruit fruit = fruitFactory.getFruit();
System.out.println("get fruit :" + fruit);
}
}