设计模式(创建型)—— 工厂方法模式
传统的获取对象方法,是通过 new 关键字获取一个对象,但是如果多个地方都需要该对象,就需要 new 很多次,这时候如果这个类发生了一些改变,如类名变了,构造方法新增了参数等,那么我们就需要修改很多地方,这就很麻烦。
工厂方法模式,就是通过一个设计一个工厂类来获取指定类的对象,因为都是通过工厂来获取对象,一旦对象所属类发生了改变,我们只需要修改工厂中获取对象的方法,这样一来大大减少修改的工作量。
但此时如果我们要求工厂产出新的对象,就不得不在工厂类中新增对应的获取方法,这就违背类开闭原则,所以我们可以进行抽象化,以水果生产为例子,我们可以设计一个抽象水果工厂类,里面有获取水果的方法。
//抽象水果工厂
public abstract class FruitFactory <T extends Fruit>{public abstract T create();
}
然后需要生产什么水果就建立对应的水果加工厂
//苹果加工厂
public class AppleFactory extends FruitFactory{@Overridepublic Fruit create() {return new Apple();}
}
此时当我们需要一个苹果对象时,就可以通过苹果工厂对象来获取一个苹果
public class test01 {public static void main(String[] args) {System.out.println(new AppleFactory().create());}
}
假如我们又想生产橘子,那就建立一个橘子加工厂,然后通过该工厂获取到橘子对象
public class OrangeFactory extends FruitFactory{@Overridepublic Fruit create() {return new Orange();}
}
工厂方法模式好处是修改方便,但坏处就是每当我们需要生产新的东西时都得建立对应的生产线,如果生产种类过多,那么生产线就非常庞大,而这些生产线大体上有很相似,这就导致我们会浪费时间做重复工作,所以这种模式比较适合所需对象类型比较少的情况