抽象工厂模式的定义:
生成器模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
demo:下面使用抽象工厂模式写一个简单的打印小程序
ExportHeaderModel:描述输出到文件头到内容的对象
ExportDataModel:描述输出数据的对象
ExportFooterModel:描述输出到文件尾到内容的对象
Builder:生成器接口
Director:指导者,知道使用生成器的接口来构建输出的文件的对象
TxtBuilder:txt生成器对象
XmlBuilder:xml生成器对象
Client:客户端
/**
* 描述输出到文件头到内容的对象
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ExportHeaderModel{
/**
* 分公司或门市编号
*/
private String depId;
/**
* 导出数据的日期
*/
private String exportDate;
}
/**
* 描述输出数据的对象
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ExportDataModel {
/**
* 产品id
*/
private String productId;
/**
* 销售价格
*/
private Integer price;
/**
* 销售数量
*/
private Integer amount;
}
/**
* 描述输出到文件尾到内容的对象
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ExportFooterModel {
/**
* 输出人
*/
private String exportUser;
}
/**
* 生成器接口
*/
public interface Builder {
void buildHeader(ExportHeaderModel exportHeaderModel);
void buildData(Map<String, List<ExportDataModel>> map);
void buildFooter(ExportFooterModel exportFooterModel);
}
/**
* 指导者,知道使用生成器的接口来构建输出的文件的对象
*/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct(ExportHeaderModel exportHeaderModel, Map<String, List<ExportDataModel>> mapDate, ExportFooterModel exportFooterModel){
builder.buildHeader(exportHeaderModel);
builder.buildData(mapDate);
builder.buildFooter(exportFooterModel);
}
}
/**
* txt生成器对象
*/
public class TxtBuilder implements Builder{
private StringBuffer sb = new StringBuffer();
@Override
public void buildHeader(ExportHeaderModel exportHeaderModel) {
sb.append(exportHeaderModel.getDepId()).append(",").append(exportHeaderModel.getExportDate()).append("\n");
}
@Override
public void buildData(Map<String, List<ExportDataModel>> map) {
for (String string : map.keySet()){
sb.append(string).append("\n");
for (ExportDataModel exportDataModel : map.get(string)){
sb.append(exportDataModel.getProductId()).append(",").append(exportDataModel.getPrice()).append(",")
.append(exportDataModel.getAmount()).append("\n");
}
}
}
@Override
public void buildFooter(ExportFooterModel exportFooterModel) {
sb.append(exportFooterModel.getExportUser());
}
public StringBuffer getResult(){
return sb;
}
}
/**
* xml生成器对象
*/
public class XmlBuilder implements Builder {
private StringBuffer sb = new StringBuffer();
@Override
public void buildHeader(ExportHeaderModel exportHeaderModel) {
sb.append("<?xml version='1.0' encoding='gb2313'?>\n");
sb.append("<Report>\n");
sb.append("<Header>\n");
sb.append("<DepId>").append(exportHeaderModel.getDepId()).append("</DepId>\n");
sb.append("ExportDate>").append(exportHeaderModel.getExportDate()).append("</ExportDate>\n");
sb.append("</Header>\n");
}
@Override
public void buildData(Map<String, List<ExportDataModel>> map) {
sb.append("<Body>\n");
for (String string : map.keySet()) {
sb.append("<Datas TableName=\"").append(string).append("\">\n");
for (ExportDataModel exportDataModel : map.get(string)) {
sb.append("<Data>\n");
sb.append("<ProductId>").append(exportDataModel.getProductId()).append("</ProductId>");
sb.append("<Price>").append(exportDataModel.getPrice()).append("</Price>");
sb.append("<Amount>").append(exportDataModel.getAmount()).append("</Amount>");
sb.append("</Data>\n");
}
}
sb.append("</Body>\n");
}
@Override
public void buildFooter(ExportFooterModel exportFooterModel) {
sb.append("<Footer>\n");
sb.append("<ExportUser>").append(exportFooterModel.getExportUser()).append("</ExportUser>\n");
sb.append("</Footer>\n");
sb.append("</Report>\n");
}
public StringBuffer getResult(){
return sb;
}
}
public class Client {
public static void main(String[] args) {
List<ExportDataModel> exportDataModelList = new ArrayList<>();
exportDataModelList.add(ExportDataModel.builder()
.productId("1")
.price(1)
.amount(1)
.build());
exportDataModelList.add(ExportDataModel.builder()
.productId("2")
.price(2)
.amount(2)
.build());
ExportFooterModel exportFooterModel = ExportFooterModel.builder()
.exportUser("lisi")
.build();
ExportHeaderModel exportHeaderModel = ExportHeaderModel.builder()
.depId("1")
.exportDate("2022-02-17")
.build();
Map<String, List<ExportDataModel>> map = new HashMap<>();
map.put("销售记录", exportDataModelList);
TxtBuilder txtBuilder = new TxtBuilder();
Director director = new Director(txtBuilder);
director.construct(exportHeaderModel, map, exportFooterModel);
System.out.println("txt:" + txtBuilder.getResult().toString());
XmlBuilder xmlBuilder = new XmlBuilder();
Director director1 = new Director(xmlBuilder);
director1.construct(exportHeaderModel, map, exportFooterModel);
System.out.println("xml:" + xmlBuilder.getResult().toString());
}
}
生成器模式的功能:
构建复杂的产品,而且是细化的、分步骤的构建产品,也就是生成器模式重在一步一步解决构建复杂对象的问题,只要配置不同的生成器,那么同样的构建过程,就能构建出不同的产品来。
生成器模式的优点:
松散耦合
可以很容易地改变产品的内部表示
更好的复用性
生成器模式的本质:
分离整体构建算法和部件构造