工厂方法模式

工厂方法模式

定义

定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

 

类型

创建型

适用场景

创建对象需要大量重复的代码

客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

一个类通过其子类来指定创建哪个对象

优点

用户只需要关心所需产品对应的工厂,无需关心细节创建

加入新的产品符合开闭原则,提高可扩展性

缺点

类的个数容易过多增加复杂度

增加了系统的抽象性和理解难度

 

例子

   抽象产品

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格式

UML

 

 

 

 





posted @ 2020-03-25 21:14  叫熊猫啊  阅读(218)  评论(0编辑  收藏  举报