java:Prototype Pattern
·
项目结构:

本文实现了一个基于原型模式的珠宝行业业务单据管理系统。系统通过BaseJewelryDocument抽象基类统一管理12种业务单据(如原料采购、设计制图、生产质检等),采用JSON序列化实现深拷贝机制。核心组件包括:
- 线程安全的
ConcurrentPrototypePool原型池管理模板单据 - 完整的日志系统(含Emoji标识和分级存储)
- 支持高并发的业务流程调度器
- 模拟从原料采购到销售的全链路业务场景
典型输出示例:
[2026-07-10 22:15:03.123][INFO]ℹ️[珠宝ERP] 🎨款式设计定稿:古法福字手镯
[2026-07-10 22:15:03.456][WARN]⚠️[珠宝ERP] 🔎批次质检完成,合格147件,不良3件
系统特点:
- 所有单据继承统一原型接口
- 支持多操作员并行业务流程
- 日志与控制台输出格式完全一致
- 每日自动归档日志文件(保留30天)
- 通过Unicode Emoji增强日志可读性
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:55
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : DesignDraftDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
public class DesignDraftDoc extends BaseJewelryDocument {
private String styleName = "";
private String draftUrl = "";
private String designer = "";
private int version;
private boolean customerConfirm;
// Getter Setter
public String getStyleName() { return styleName; }
public void setStyleName(String styleName) { this.styleName = styleName; }
public String getDraftUrl() { return draftUrl; }
public void setDraftUrl(String draftUrl) { this.draftUrl = draftUrl; }
public String getDesigner() { return designer; }
public void setDesigner(String designer) { this.designer = designer; }
public int getVersion() { return version; }
public void setVersion(int version) { this.version = version; }
public boolean isCustomerConfirm() { return customerConfirm; }
public void setCustomerConfirm(boolean customerConfirm) { this.customerConfirm = customerConfirm; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:57
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : FinanceBillDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import java.math.BigDecimal;
public class FinanceBillDoc extends BaseJewelryDocument {
private String relateBizNo = "";
private String billType = "";
private BigDecimal amount = BigDecimal.ZERO;
private String cashier = "";
private String payWay = "";
private boolean audited;
// Getter Setter
public String getRelateBizNo() { return relateBizNo; }
public void setRelateBizNo(String relateBizNo) { this.relateBizNo = relateBizNo; }
public String getBillType() { return billType; }
public void setBillType(String billType) { this.billType = billType; }
public BigDecimal getAmount() { return amount; }
public void setAmount(BigDecimal amount) { this.amount = amount; }
public String getCashier() { return cashier; }
public void setCashier(String cashier) { this.cashier = cashier; }
public String getPayWay() { return payWay; }
public void setPayWay(String payWay) { this.payWay = payWay; }
public boolean isAudited() { return audited; }
public void setAudited(boolean audited) { this.audited = audited; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:59
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : HrAdminDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import java.math.BigDecimal;
public class HrAdminDoc extends BaseJewelryDocument {
private String staffId = "";
private String staffName = "";
private String department = "";
private String operateType = "";
private BigDecimal salary = BigDecimal.ZERO;
// Getter Setter
public String getStaffId() { return staffId; }
public void setStaffId(String staffId) { this.staffId = staffId; }
public String getStaffName() { return staffName; }
public void setStaffName(String staffName) { this.staffName = staffName; }
public String getDepartment() { return department; }
public void setDepartment(String department) { this.department = department; }
public String getOperateType() { return operateType; }
public void setOperateType(String operateType) { this.operateType = operateType; }
public BigDecimal getSalary() { return salary; }
public void setSalary(BigDecimal salary) { this.salary = salary; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 22:00
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : ItOpsDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import java.time.LocalDateTime;
public class ItOpsDoc extends BaseJewelryDocument {
private String deviceSystem = "";
private String faultDesc = "";
private String maintainer = "";
private boolean fixed;
private LocalDateTime fixFinishTime;
// Getter Setter
public String getDeviceSystem() { return deviceSystem; }
public void setDeviceSystem(String deviceSystem) { this.deviceSystem = deviceSystem; }
public String getFaultDesc() { return faultDesc; }
public void setFaultDesc(String faultDesc) { this.faultDesc = faultDesc; }
public String getMaintainer() { return maintainer; }
public void setMaintainer(String maintainer) { this.maintainer = maintainer; }
public boolean isFixed() { return fixed; }
public void setFixed(boolean fixed) { this.fixed = fixed; }
public LocalDateTime getFixFinishTime() { return fixFinishTime; }
public void setFixFinishTime(LocalDateTime fixFinishTime) { this.fixFinishTime = fixFinishTime; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:57
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : LogisticsDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import java.time.LocalDateTime;
public class LogisticsDoc extends BaseJewelryDocument {
private String relatePackNo = "";
private String express = "";
private String trackNo = "";
private String receiveAddr = "";
private String receiver = "";
private LocalDateTime shipTime;
// Getter Setter
public String getRelatePackNo() { return relatePackNo; }
public void setRelatePackNo(String relatePackNo) { this.relatePackNo = relatePackNo; }
public String getExpress() { return express; }
public void setExpress(String express) { this.express = express; }
public String getTrackNo() { return trackNo; }
public void setTrackNo(String trackNo) { this.trackNo = trackNo; }
public String getReceiveAddr() { return receiveAddr; }
public void setReceiveAddr(String receiveAddr) { this.receiveAddr = receiveAddr; }
public String getReceiver() { return receiver; }
public void setReceiver(String receiver) { this.receiver = receiver; }
public LocalDateTime getShipTime() { return shipTime; }
public void setShipTime(LocalDateTime shipTime) { this.shipTime = shipTime; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 22:09
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : MarketingPromoDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import java.math.BigDecimal;
import java.time.LocalDateTime;
public class MarketingPromoDoc extends BaseJewelryDocument {
private String promoName = "";
private String channel = "";
private BigDecimal discountRate = BigDecimal.ZERO;
private LocalDateTime startTime;
private LocalDateTime endTime;
private String marketStaff = "";
// Getter Setter
public String getPromoName() { return promoName; }
public void setPromoName(String promoName) { this.promoName = promoName; }
public String getChannel() { return channel; }
public void setChannel(String channel) { this.channel = channel; }
public BigDecimal getDiscountRate() { return discountRate; }
public void setDiscountRate(BigDecimal discountRate) { this.discountRate = discountRate; }
public LocalDateTime getStartTime() { return startTime; }
public void setStartTime(LocalDateTime startTime) { this.startTime = startTime; }
public LocalDateTime getEndTime() { return endTime; }
public void setEndTime(LocalDateTime endTime) { this.endTime = endTime; }
public String getMarketStaff() { return marketStaff; }
public void setMarketStaff(String marketStaff) { this.marketStaff = marketStaff; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:56
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : PackDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
public class PackDoc extends BaseJewelryDocument {
private String relateInspectNo = "";
private String boxLevel = "";
private int packTotal;
private String packer = "";
private String barCode = "";
// Getter Setter
public String getRelateInspectNo() { return relateInspectNo; }
public void setRelateInspectNo(String relateInspectNo) { this.relateInspectNo = relateInspectNo; }
public String getBoxLevel() { return boxLevel; }
public void setBoxLevel(String boxLevel) { this.boxLevel = boxLevel; }
public int getPackTotal() { return packTotal; }
public void setPackTotal(int packTotal) { this.packTotal = packTotal; }
public String getPacker() { return packer; }
public void setPacker(String packer) { this.packer = packer; }
public String getBarCode() { return barCode; }
public void setBarCode(String barCode) { this.barCode = barCode; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:56
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : ProductionDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import java.time.LocalDateTime;
public class ProductionDoc extends BaseJewelryDocument {
private String relateDraftNo = "";
private int batchNo;
private int produceQty;
private String workshop = "";
private String craftsman = "";
private LocalDateTime planFinish;
// Getter Setter
public String getRelateDraftNo() { return relateDraftNo; }
public void setRelateDraftNo(String relateDraftNo) { this.relateDraftNo = relateDraftNo; }
public int getBatchNo() { return batchNo; }
public void setBatchNo(int batchNo) { this.batchNo = batchNo; }
public int getProduceQty() { return produceQty; }
public void setProduceQty(int produceQty) { this.produceQty = produceQty; }
public String getWorkshop() { return workshop; }
public void setWorkshop(String workshop) { this.workshop = workshop; }
public String getCraftsman() { return craftsman; }
public void setCraftsman(String craftsman) { this.craftsman = craftsman; }
public LocalDateTime getPlanFinish() { return planFinish; }
public void setPlanFinish(LocalDateTime planFinish) { this.planFinish = planFinish; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:56
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : QualityInspectDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
public class QualityInspectDoc extends BaseJewelryDocument {
private String relateProductionNo = "";
private int passQty;
private int defectQty;
private String inspector = "";
private String defectRemark = "";
private boolean batchPass;
// Getter Setter
public String getRelateProductionNo() { return relateProductionNo; }
public void setRelateProductionNo(String relateProductionNo) { this.relateProductionNo = relateProductionNo; }
public int getPassQty() { return passQty; }
public void setPassQty(int passQty) { this.passQty = passQty; }
public int getDefectQty() { return defectQty; }
public void setDefectQty(int defectQty) { this.defectQty = defectQty; }
public String getInspector() { return inspector; }
public void setInspector(String inspector) { this.inspector = inspector; }
public String getDefectRemark() { return defectRemark; }
public void setDefectRemark(String defectRemark) { this.defectRemark = defectRemark; }
public boolean isBatchPass() { return batchPass; }
public void setBatchPass(boolean batchPass) { this.batchPass = batchPass; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:55
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : RawMaterialPurchaseDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import java.math.BigDecimal;
public class RawMaterialPurchaseDoc extends BaseJewelryDocument {
private String materialType = "";
private BigDecimal weight = BigDecimal.ZERO;
private BigDecimal unitPrice = BigDecimal.ZERO;
private String supplier = "";
private boolean qualityPass;
private String inspectionNo = "";
public BigDecimal getTotalCost() {
return weight.multiply(unitPrice);
}
// Getter Setter
public String getMaterialType() { return materialType; }
public void setMaterialType(String materialType) { this.materialType = materialType; }
public BigDecimal getWeight() { return weight; }
public void setWeight(BigDecimal weight) { this.weight = weight; }
public BigDecimal getUnitPrice() { return unitPrice; }
public void setUnitPrice(BigDecimal unitPrice) { this.unitPrice = unitPrice; }
public String getSupplier() { return supplier; }
public void setSupplier(String supplier) { this.supplier = supplier; }
public boolean isQualityPass() { return qualityPass; }
public void setQualityPass(boolean qualityPass) { this.qualityPass = qualityPass; }
public String getInspectionNo() { return inspectionNo; }
public void setInspectionNo(String inspectionNo) { this.inspectionNo = inspectionNo; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:59
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : SaleDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import java.math.BigDecimal;
public class SaleDoc extends BaseJewelryDocument {
private String customerName = "";
private String customerPhone = "";
private BigDecimal saleTotal = BigDecimal.ZERO;
private String salesman = "";
private String relatePromoNo = "";
// Getter Setter
public String getCustomerName() { return customerName; }
public void setCustomerName(String customerName) { this.customerName = customerName; }
public String getCustomerPhone() { return customerPhone; }
public void setCustomerPhone(String customerPhone) { this.customerPhone = customerPhone; }
public BigDecimal getSaleTotal() { return saleTotal; }
public void setSaleTotal(BigDecimal saleTotal) { this.saleTotal = saleTotal; }
public String getSalesman() { return salesman; }
public void setSalesman(String salesman) { this.salesman = salesman; }
public String getRelatePromoNo() { return relatePromoNo; }
public void setRelatePromoNo(String relatePromoNo) { this.relatePromoNo = relatePromoNo; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 22:00
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : TrainingRecordDoc.java
* explain : 学习 类
**/
package PrototypePattern.business.documents;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
public class TrainingRecordDoc extends BaseJewelryDocument {
private String trainTheme = "";
private String trainer = "";
private List<String> traineeIds = new ArrayList<>();
private LocalDateTime trainStart;
private LocalDateTime trainEnd;
private BigDecimal trainCost = BigDecimal.ZERO;
// Getter Setter
public String getTrainTheme() { return trainTheme; }
public void setTrainTheme(String trainTheme) { this.trainTheme = trainTheme; }
public String getTrainer() { return trainer; }
public void setTrainer(String trainer) { this.trainer = trainer; }
public List<String> getTraineeIds() { return traineeIds; }
public void setTraineeIds(List<String> traineeIds) { this.traineeIds = traineeIds; }
public LocalDateTime getTrainStart() { return trainStart; }
public void setTrainStart(LocalDateTime trainStart) { this.trainStart = trainStart; }
public LocalDateTime getTrainEnd() { return trainEnd; }
public void setTrainEnd(LocalDateTime trainEnd) { this.trainEnd = trainEnd; }
public BigDecimal getTrainCost() { return trainCost; }
public void setTrainCost(BigDecimal trainCost) { this.trainCost = trainCost; }
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:48
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : LogTemplateConstant.java
* explain : 学习 类
**/
package PrototypePattern.core.constants;
/**
* 日志模板常量,控制台、文件输出模板完全一致,对齐C#实现
*/
public class LogTemplateConstant {
// 日志格式化模板
public static final String TEMPLATE = "[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] %emoji [%c] %m%n%ex";
// 日期文件夹格式
public static final String DATE_FOLDER_FORMAT = "yyyy-MM-dd";
// 文件路径模板 Logs/2026-07-10/app-{level}.log
public static final String FILE_PATH_FORMAT = "Logs/%d{" + DATE_FOLDER_FORMAT + "}/app-%p.log";
// 日志根目录
public static final String LOG_BASE_PATH = "Logs";
// 自动清理日志天数
public static final int RETAIN_LOG_DAYS = 30;
// 日志等级对应Unicode Emoji
public static final String EMOJI_DEBUG = "🔍";
public static final String EMOJI_INFO = "ℹ️";
public static final String EMOJI_WARN = "⚠️";
public static final String EMOJI_ERROR = "❌";
public static final String EMOJI_CRITICAL = "🔥";
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:53
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : JewelryFileLogConfig.java
* explain : 学习 类
**/
package PrototypePattern.core.extensions.logging;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import ch.qos.logback.core.spi.FilterReply;
import ch.qos.logback.classic.filter.LevelFilter;
import PrototypePattern.core.constants.LogTemplateConstant;
import org.slf4j.LoggerFactory;
public class JewelryFileLogConfig {
private LoggerContext context;
public JewelryFileLogConfig() {
initEnterpriseLog();
}
private void initEnterpriseLog() {
context = (LoggerContext) LoggerFactory.getILoggerFactory();
context.reset();
PatternLayoutEncoder sharedEncoder = new PatternLayoutEncoder();
sharedEncoder.setContext(context);
sharedEncoder.setPattern(LogTemplateConstant.TEMPLATE.replace("%emoji", "%marker"));
sharedEncoder.start();
createFileAppender(Level.DEBUG, sharedEncoder);
createFileAppender(Level.INFO, sharedEncoder);
createFileAppender(Level.WARN, sharedEncoder);
createFileAppender(Level.ERROR, sharedEncoder);
ConsoleAppender<ILoggingEvent> consoleAppender = new ConsoleAppender<>();
consoleAppender.setContext(context);
consoleAppender.setEncoder(sharedEncoder);
consoleAppender.start();
Logger rootLogger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
rootLogger.setLevel(Level.DEBUG);
rootLogger.addAppender(consoleAppender);
context.getLogger("java").setLevel(Level.WARN);
context.getLogger("org.springframework").setLevel(Level.WARN);
}
private void createFileAppender(Level level, PatternLayoutEncoder encoder) {
RollingFileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<>();
fileAppender.setContext(context);
fileAppender.setName("FILE_" + level.levelStr);
TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
rollingPolicy.setContext(context);
rollingPolicy.setParent(fileAppender);
rollingPolicy.setFileNamePattern(LogTemplateConstant.LOG_BASE_PATH + "/%d{" + LogTemplateConstant.DATE_FOLDER_FORMAT + "}/app-" + level.levelStr.toLowerCase() + ".log");
rollingPolicy.setMaxHistory(LogTemplateConstant.RETAIN_LOG_DAYS);
rollingPolicy.start();
LevelFilter levelFilter = new LevelFilter();
levelFilter.setContext(context);
levelFilter.setLevel(level);
levelFilter.setOnMatch(FilterReply.ACCEPT);
levelFilter.setOnMismatch(FilterReply.DENY);
levelFilter.start();
fileAppender.addFilter(levelFilter);
fileAppender.setEncoder(encoder);
fileAppender.start();
Logger rootLogger = context.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(fileAppender);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:53
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : BaseJewelryDocument.java
* explain : 学习 类
**/
package PrototypePattern.core.prototype;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.time.LocalDateTime;
/**
* 所有业务单据父类,统一基础字段、通用深拷贝逻辑
*/
public abstract class BaseJewelryDocument implements IJewelryPrototype {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
.registerModule(new JavaTimeModule())
.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 单据编号
private String docNo = "";
// 业务模块名称
private String bizModule = "";
// 操作人
private String operator = "";
// 创建时间
private LocalDateTime createTime = LocalDateTime.now();
// Getter & Setter
public String getDocNo() { return docNo; }
public void setDocNo(String docNo) { this.docNo = docNo; }
public String getBizModule() { return bizModule; }
public void setBizModule(String bizModule) { this.bizModule = bizModule; }
public String getOperator() { return operator; }
public void setOperator(String operator) { this.operator = operator; }
public LocalDateTime getCreateTime() { return createTime; }
public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
/** 浅拷贝 native clone */
@Override
public IJewelryPrototype clone() {
try {
return (IJewelryPrototype) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException("浅拷贝失败", e);
}
}
/** JSON序列化通用深拷贝,所有单据共用,线程安全隔离数据 */
@Override
public IJewelryPrototype deepClone() {
try {
String json = OBJECT_MAPPER.writeValueAsString(this);
return OBJECT_MAPPER.readValue(json, this.getClass());
} catch (JsonProcessingException e) {
throw new RuntimeException("深拷贝序列化失败", e);
}
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:53
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : IJewelryPrototype.java
* explain : 学习 类
**/
package PrototypePattern.core.prototype;
/**
* 珠宝单据原型顶层接口,统一浅拷贝、深拷贝规范,对齐C# IJewelryPrototype
*/
public interface IJewelryPrototype {
/** 浅拷贝 */
IJewelryPrototype clone();
/** 深拷贝,多线程数据隔离安全 */
IJewelryPrototype deepClone();
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:53
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : ConcurrentPrototypePool.java
* explain : 学习 类
**/
package PrototypePattern.core.threadsafe;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;
public class ConcurrentPrototypePool {
private static final Logger log = LoggerFactory.getLogger(ConcurrentPrototypePool.class);
private final Map<String, BaseJewelryDocument> templateStore = new ConcurrentHashMap<>();
public void registerTemplate(String bizKey, BaseJewelryDocument templateDoc) {
if (templateStore.containsKey(bizKey)) {
log.warn("⚠️ 业务模板 {} 已存在,覆盖原有模板", bizKey);
}
templateStore.put(bizKey, templateDoc);
log.debug("🔍 注册原型模板成功 Key:{} Module:{}", bizKey, templateDoc.getBizModule());
}
@SuppressWarnings("unchecked")
public <T extends BaseJewelryDocument> T getCloneDocument(String bizKey) {
if (!templateStore.containsKey(bizKey)) {
log.error("❌ 原型池不存在业务模板 Key:{}", bizKey);
throw new RuntimeException("业务原型模板[" + bizKey + "]未注册");
}
BaseJewelryDocument template = templateStore.get(bizKey);
T newDoc = (T) template.deepClone();
newDoc.setDocNo(generateUniqueDocNo(bizKey));
newDoc.setCreateTime(LocalDateTime.now());
log.debug("✅ 克隆生成单据 模块:{} 单号:{}", newDoc.getBizModule(), newDoc.getDocNo());
return newDoc;
}
public int getRegisteredTemplateCount() {
return templateStore.size();
}
private String generateUniqueDocNo(String bizKey) {
String timeStr = java.time.format.DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now());
int random = ThreadLocalRandom.current().nextInt(100, 999);
return bizKey + "_" + timeStr + "_" + random;
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:53
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : JewelryTemplateInitializer.java
* explain : 学习 类
**/
package PrototypePattern.workflow.pool;
import PrototypePattern.business.documents.*;
import PrototypePattern.core.threadsafe.ConcurrentPrototypePool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JewelryTemplateInitializer {
private static final Logger log = LoggerFactory.getLogger(JewelryTemplateInitializer.class);
private final ConcurrentPrototypePool prototypePool;
public JewelryTemplateInitializer(ConcurrentPrototypePool prototypePool) {
this.prototypePool = prototypePool;
}
public void loadAllBusinessTemplates() {
RawMaterialPurchaseDoc rawDoc = new RawMaterialPurchaseDoc();
rawDoc.setBizModule("原料采购核验");
prototypePool.registerTemplate("RawMaterial", rawDoc);
DesignDraftDoc designDoc = new DesignDraftDoc();
designDoc.setBizModule("设计制图");
prototypePool.registerTemplate("Design", designDoc);
ProductionDoc prodDoc = new ProductionDoc();
prodDoc.setBizModule("加工生产");
prototypePool.registerTemplate("Production", prodDoc);
QualityInspectDoc qcDoc = new QualityInspectDoc();
qcDoc.setBizModule("质检");
prototypePool.registerTemplate("Quality", qcDoc);
PackDoc packDoc = new PackDoc();
packDoc.setBizModule("包装");
prototypePool.registerTemplate("Pack", packDoc);
LogisticsDoc logisticsDoc = new LogisticsDoc();
logisticsDoc.setBizModule("物流");
prototypePool.registerTemplate("Logistics", logisticsDoc);
FinanceBillDoc finDoc = new FinanceBillDoc();
finDoc.setBizModule("财务");
prototypePool.registerTemplate("Finance", finDoc);
MarketingPromoDoc marketDoc = new MarketingPromoDoc();
marketDoc.setBizModule("营销推广");
prototypePool.registerTemplate("Marketing", marketDoc);
SaleDoc saleDoc = new SaleDoc();
saleDoc.setBizModule("业务销售");
prototypePool.registerTemplate("Sale", saleDoc);
HrAdminDoc hrDoc = new HrAdminDoc();
hrDoc.setBizModule("人事行政");
prototypePool.registerTemplate("Hr", hrDoc);
ItOpsDoc itDoc = new ItOpsDoc();
itDoc.setBizModule("IT运维");
prototypePool.registerTemplate("IT", itDoc);
TrainingRecordDoc trainDoc = new TrainingRecordDoc();
trainDoc.setBizModule("员工培训");
prototypePool.registerTemplate("Train", trainDoc);
int count = prototypePool.getRegisteredTemplateCount();
log.info("🏭 全部业务原型模板加载完成,共注册 {} 套单据模板", count);
}
}
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:53
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : JewelryBusinessFlowScheduler.java
* explain : 学习 类
**/
package PrototypePattern.workflow.scheduler;
import PrototypePattern.business.documents.*;
import PrototypePattern.core.prototype.BaseJewelryDocument;
import PrototypePattern.core.threadsafe.ConcurrentPrototypePool;
import PrototypePattern.workflow.pool.JewelryTemplateInitializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
public class JewelryBusinessFlowScheduler {
private static final Logger log = LoggerFactory.getLogger(JewelryBusinessFlowScheduler.class);
private final ConcurrentPrototypePool prototypePool;
public JewelryBusinessFlowScheduler(ConcurrentPrototypePool prototypePool) {
this.prototypePool = prototypePool;
log.debug("🔍 业务流程调度器实例化完成");
}
public <T extends BaseJewelryDocument> T createDocument(String bizKey) {
return prototypePool.getCloneDocument(bizKey);
}
public CompletableFuture<Void> executeFullProductionSaleFlowAsync(String operatorName) {
return CompletableFuture.runAsync(() -> {
try {
log.info("🚀 启动完整珠宝全业务流程,操作员:{}", operatorName);
RawMaterialPurchaseDoc rawDoc = createDocument("RawMaterial");
rawDoc.setOperator(operatorName);
rawDoc.setMaterialType("足金999");
rawDoc.setWeight(new BigDecimal("600"));
rawDoc.setUnitPrice(new BigDecimal("585"));
rawDoc.setSupplier("深圳黄金原料供应商");
rawDoc.setQualityPass(true);
rawDoc.setInspectionNo("INS" + ThreadLocalRandom.current().nextInt(10000, 99999));
log.info("📥 原料入库核验完成,采购总金额:{}", rawDoc.getTotalCost());
DesignDraftDoc designDoc = createDocument("Design");
designDoc.setOperator(operatorName);
designDoc.setStyleName("古法福字手镯");
designDoc.setDesigner("刘设计师");
designDoc.setCustomerConfirm(true);
log.info("🎨 款式设计定稿:{}", designDoc.getStyleName());
ProductionDoc prodDoc = createDocument("Production");
prodDoc.setOperator(operatorName);
prodDoc.setRelateDraftNo(designDoc.getDocNo());
prodDoc.setProduceQty(150);
prodDoc.setWorkshop("黄金一号车间");
prodDoc.setPlanFinish(LocalDateTime.now().plusDays(3));
log.info("⚒️ 生产批次创建,计划产量:{}", prodDoc.getProduceQty());
QualityInspectDoc qcDoc = createDocument("Quality");
qcDoc.setOperator(operatorName);
qcDoc.setRelateProductionNo(prodDoc.getDocNo());
qcDoc.setPassQty(147);
qcDoc.setDefectQty(3);
qcDoc.setBatchPass(true);
log.warn("🔎 批次质检完成,合格{}件,不良{}件", qcDoc.getPassQty(), qcDoc.getDefectQty());
PackDoc packDoc = createDocument("Pack");
packDoc.setOperator(operatorName);
packDoc.setRelateInspectNo(qcDoc.getDocNo());
packDoc.setPackTotal(qcDoc.getPassQty());
log.info("🎁 成品礼盒包装完成,合计{}件", packDoc.getPackTotal());
LogisticsDoc logDoc = createDocument("Logistics");
logDoc.setOperator(operatorName);
logDoc.setRelatePackNo(packDoc.getDocNo());
logDoc.setExpress("珠宝安保专线物流");
logDoc.setTrackNo("JL" + ThreadLocalRandom.current().nextLong(1000000, 9999999));
logDoc.setShipTime(LocalDateTime.now());
log.info("🚚 物流已发出,运单号:{}", logDoc.getTrackNo());
FinanceBillDoc finDoc = createDocument("Finance");
finDoc.setOperator(operatorName);
finDoc.setRelateBizNo(rawDoc.getDocNo());
finDoc.setBillType("原料采购支出");
finDoc.setAmount(rawDoc.getTotalCost());
finDoc.setAudited(true);
log.info("💰 财务单据审核完成,金额:{}", finDoc.getAmount());
MarketingPromoDoc marketDoc = createDocument("Marketing");
marketDoc.setOperator(operatorName);
marketDoc.setPromoName("七夕黄金满减活动");
marketDoc.setDiscountRate(new BigDecimal("0.9"));
log.info("📢 营销活动创建:{}", marketDoc.getPromoName());
SaleDoc saleDoc = createDocument("Sale");
saleDoc.setOperator(operatorName);
saleDoc.setRelatePromoNo(marketDoc.getDocNo());
saleDoc.setSaleTotal(new BigDecimal("32800"));
saleDoc.setCustomerName("张女士");
log.info("🛒 销售成交,客户:{} 成交额:{}", saleDoc.getCustomerName(), saleDoc.getSaleTotal());
HrAdminDoc hrDoc = createDocument("Hr");
hrDoc.setOperator(operatorName);
hrDoc.setStaffName(operatorName);
hrDoc.setOperateType("日常业务操作记录");
log.debug("👔 人事操作日志生成");
ItOpsDoc itDoc = createDocument("IT");
itDoc.setOperator(operatorName);
itDoc.setDeviceSystem("珠宝ERP管理系统");
itDoc.setFixed(true);
log.debug("💻 IT运维巡检完成,系统无故障");
TrainingRecordDoc trainDoc = createDocument("Train");
trainDoc.setOperator(operatorName);
trainDoc.setTrainTheme("新款珠宝销售话术培训");
trainDoc.getTraineeIds().addAll(List.of("S001", "S002", "S003"));
log.info("📚 员工培训记录创建完成");
log.info("✅ 珠宝全业务流程执行完毕,操作员:{}", operatorName);
Thread.sleep(5);
} catch (Exception ex) {
log.error("🔥 业务流程执行异常,操作员:{}", operatorName, ex);
throw new RuntimeException(ex);
}
});
}
}
调用:
/**
* encoding: utf-8
* 版权所有 2026 ©涂聚文有限公司 ®
* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
* 描述:创建型模式 Prototype Pattern 原型模式
* Author : geovindu,Geovin Du 涂聚文.
* IDE : IntelliJ IDEA 2024.3.6 Java 17
* # database : Oracle21c,MySQL 9.0,SQL Server 2019,PostgreSQL 17.1 Neo4j
* # OS : window10
* Datetime : 2026 - 2026/7/10 - 21:53
* User : geovindu
* Product : IntelliJ IDEA
* Project : javadesginpattern
* File : PrototypeBll.java
* explain : 学习 类
**/
package BLL;
import PrototypePattern.core.extensions.logging.JewelryFileLogConfig;
import PrototypePattern.core.threadsafe.ConcurrentPrototypePool;
import PrototypePattern.workflow.pool.JewelryTemplateInitializer;
import PrototypePattern.workflow.scheduler.JewelryBusinessFlowScheduler;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class PrototypeBll {
public void demo() {
System.setOut(new PrintStream(System.out, true, StandardCharsets.UTF_8));
new JewelryFileLogConfig();
ConcurrentPrototypePool prototypePool = new ConcurrentPrototypePool();
JewelryTemplateInitializer templateInitializer = new JewelryTemplateInitializer(prototypePool);
JewelryBusinessFlowScheduler scheduler = new JewelryBusinessFlowScheduler(prototypePool);
templateInitializer.loadAllBusinessTemplates();
List<String> operatorList = List.of("王店长", "李工艺师", "陈运营");
List<CompletableFuture<Void>> taskList = operatorList.stream()
.map(op -> scheduler.executeFullProductionSaleFlowAsync(op))
.toList();
CompletableFuture.allOf(taskList.toArray(new CompletableFuture[0])).join();
System.out.println("\n==============================");
System.out.println("全部高并发业务流程执行完成!");
System.out.println("日志目录结构:Logs/yyyy-MM-dd/");
System.out.println("分级日志文件:app-debug.log / app-info.log / app-warn.log / app-error.log");
System.out.println("控制台输出与日志文件内容、模板、Emoji完全一致");
System.out.println("==============================");
}
}
输出:

更多推荐



所有评论(0)