定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
创建型
创建对象需要大量重复的代码
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
一个类通过其子类来指定创建哪个对象
用户只需要关心所需产品对应的工厂,无需关心细节创建
加入新的产品符合开闭原则,提高可扩展性
类的个数容易过多增加复杂度
增加了系统的抽象性和理解难度
抽象产品
public abstract class FormatConverter {
public abstract void produce();
}
派生的Txt数据转换产品
public class TxtFormatConverter extends FormatConverter {
@Override
public void produce() {
System.out.println("转换Txt为XML格式");
}
}
派生的Database数据转换产品
public class DatabaseFormatConverter extends FormatConverter {
@Override
public void produce() {
System.out.println("转换Database数据为XML格式");
}
}
派生的Excel数据转换产品
public class ExcelFormatConverter extends FormatConverter {
@Override
public void produce() {
System.out.println("转换Excel数据为XML格式");
}
}
抽象工厂
public abstract class FormatConverterFactory{
public abstract FormatConverter getFormatConverter();
}
生产Database数据转换产品的工厂
public class ExcelFormatConverterFactory extends FormatConverterFactory {
@Override
public FormatConverter getFormatConverter() {
return new DatabaseFormatConverter();
}
}
生产Database数据转换产品的工厂
public class DatabaseFormatConverterFactory extends FormatConverterFactory {
@Override
public FormatConverter getFormatConverter() {
return new DatabaseFormatConverter();
}
}
生产Excel数据转换产品的工厂
public class ExcelFormatConverterFactory extends FormatConverterFactory {
@Override
public FormatConverter getFormatConverter() {
return new ExcelFormatConverter();
}
}
测试类
public class Test {
public static void main(String[] args) {
FormatConverter formatConverter = new ExcelFormatConverterFactory().getFormatConverter();
formatConverter.produce();
formatConverter = new DatabaseFormatConverterFactory().getFormatConverter();
formatConverter.produce();
formatConverter = new TxtFormatConverterFactory().getFormatConverter();
formatConverter.produce();
}
}
输出:
转换Excel数据为XML格式
转换Database数据为XML格式
转换Txt为XML格式
原文:https://www.cnblogs.com/pandayo/p/12570384.html