/** * Simulates an expensive object: database connection (time-consuming creation, high resource usage) * Implements Prototype interface to support cloning * @author chuyang * @version 1.0 */ public class DatabaseConnection implements Prototype { /** * Connection unique identifier */ private String connectionId; /** * Database URL */ private String databaseUrl; /** * Whether the connection is currently in use (pool management status) */ private boolean isInUse; public ConnectionPoolManager m_ConnectionPoolManager; public DatabaseConnection(){ this.connectionId = ""; this.databaseUrl = ""; this.isInUse = false; } @Override public void finalize() throws Throwable { // Cleanup when connection is closed System.out.println("Connection " + connectionId + " is being finalized"); } /** * Constructor: Simulates high-cost creation scenarios (network connections, authentication, etc.) * * @param connectionId Connection ID * @param databaseUrl Database URL */ public DatabaseConnection(String connectionId, String databaseUrl){ // Simulate time-consuming connection creation try { Thread.sleep(100); // Simulate connection creation delay } catch (InterruptedException e) { Thread.currentThread().interrupt(); } this.connectionId = connectionId; this.databaseUrl = databaseUrl; this.isInUse = false; System.out.println("Connection " + connectionId + " created to " + databaseUrl); } /** * Reset connection state: Called when returning to pool, clears temporary data and marks as idle */ public void reset(){ // Clear temporary data this.isInUse = false; System.out.println("Connection " + connectionId + " has been reset"); } /** * Clone method: Used to quickly copy objects (more efficient than new) * @return Cloned object */ @Override public DatabaseConnection clone(){ try { // Create new connection object and copy properties DatabaseConnection cloned = (DatabaseConnection) super.clone(); cloned.connectionId = this.connectionId + "_clone"; cloned.databaseUrl = this.databaseUrl; cloned.isInUse = false; System.out.println("Connection " + connectionId + " cloned as " + cloned.connectionId); return cloned; } catch (CloneNotSupportedException e) { throw new RuntimeException("Clone failed", e); } } // Getter and Setter methods public String getConnectionId() { return connectionId; } public void setConnectionId(String connectionId) { this.connectionId = connectionId; } public String getDatabaseUrl() { return databaseUrl; } public void setDatabaseUrl(String databaseUrl) { this.databaseUrl = databaseUrl; } public boolean isInUse() { return isInUse; } public void setInUse(boolean inUse) { isInUse = inUse; } }