定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类,克服了简单工厂违背开发-封闭的原则,又保持了封装对象创建工厂的优点
工厂接口:
/**
* 工厂类接口
*/
interface Factory {
Animal create(String s);
}
生产对象接口:
@AllArgsConstructor
@Data
class Animal {
private String type;
}
各种实例化的生产工厂:
@Log4j2
class PigFactory implements Factory {
@Override
public Animal create(String s) {
log.info("生产猪的工厂");
return new Animal(s);
}
}
@Log4j2
class ChickenFactory implements Factory {
@Override
public Animal create(String s) {
log.info("生产鸡的工厂");
return new Animal(s);
}
}
运用:
Factory pigFactory = new PigFactory();
pigFactory.create("猪");
Factory chickenFactory = new ChickenFactory();
chickenFactory.create("鸡");
结果:
16:15:02.245 [main] INFO com.learn.putc.designpatterns.create.factory.PigFactory - 生产猪的工厂
16:15:02.249 [main] INFO com.learn.putc.designpatterns.create.factory.ChickenFactory - 生产鸡的工厂
需要创建哪种对象就实例化哪种工厂,因为这种特点,每新增一种产品就要新加一种工厂,客户端还是要有修改