首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式:原型模式原理與 Android 語音錄製實戰

     編輯:Java 相關知識

第一部分:原型模式深度解析

模式定義

原型模式通過複製現有實例(原型)來創建新對象,而非通過構造函數實例化。適用於對象創建開銷大、構造參數複雜、或需動態配置對象狀態的場景。

Java 實現基石:clone()

Java 通過實現 Cloneable 接口並覆寫 clone() 實現淺/深複製:

public abstract class AbstractSpoon implements Cloneable {
    private String spoonName;
    // getter/setter 省略
    @Override
    public Object clone() {
        try {
            return super.clone(); // 淺複製
        } catch (CloneNotSupportedException e) {
            throw new AssertionError(); // 不可能發生
        }
    }
}

public class SoupSpoon extends AbstractSpoon {
    public SoupSpoon() { setSpoonName("Soup Spoon"); }
}
public class SaladSpoon extends AbstractSpoon {
    public SaladSpoon() { setSpoonName("Salad Spoon"); }
}

// 客戶端
AbstractSpoon spoon1 = new SoupSpoon();
AbstractSpoon spoon2 = (AbstractSpoon) spoon1.clone(); // 克隆新對象

淺複製 vs 深複製

  • 淺複製:super.clone() 默認行為,引用類型字段共享同一對象。
  • 深複製:在 clone() 中手動複製引用字段,或使用序列化/JSON 反序列化實現完全隔離。

結合工廠模式

public class SpoonFactory {
    private Map<String, AbstractSpoon> prototypes = new HashMap<>();
    public SpoonFactory() {
        prototypes.put("soup", new SoupSpoon());
        prototypes.put("salad", new SaladSpoon());
    }
    public AbstractSpoon createSpoon(String type) {
        return prototypes.get(type).clone();
    }
}

第二部分:Android 語音錄製完整實現

原文附帶一個完整的微信式語音錄製控件實現,包含錄音管理、UI 交互、播放控制。核心類結構:

核心類職責

類職責
AudioManager單例,封裝 MediaRecorder 錄音、音量級獲取、文件管理
AudioRecorderButton繼承 Button,處理長按/滑動取消/釋放發送邏輯,狀態機控制 UI
DialogManager管理錄音彈窗:錄音中/取消/時間過短/音量級動畫顯示
MediaManager單例,封裝 MediaPlayer 播放/暫停/釋放
RecoderAdapterListView 適配器,動態調整項寬度展示錄音時長
MainActivity綁定錄音按鈕回調,管理錄音列表、播放動畫與生命周期

關鍵交互流程

  1. 長按按鈕 → AudioManager.prepareAudio() 異步準備 → Handler 收到 MSG_AUDIO_PREPARED 顯示彈窗 → 開啟子線程定時獲取音量級更新 UI。
  2. 手指滑動超出範圍 → 切換至「想要取消」狀態,彈窗提示「松開手指,取消發送」。
  3. 釋放手指:
      • 錄音 < 0.6s → 提示「時間過短」刪除文件。
      • 正常錄音 → 回調 onFinish(seconds, filePath) 添加列表。
      • 取消狀態 → 刪除文件。
  4. 列表項點擊 → MediaManager.playSound 播放,配合幀動畫顯示播放狀態。

工程化建議

  • 音頻採樣率/編碼(AMR_NB)適合語音,文件小;若需高保真可改 AAC。
  • 文件存儲路徑應用 Context.getExternalFilesDir() 替代硬編碼 /storage/sdcard0/,適配 Android 10+ 分區存儲。
  • MediaRecorder/MediaPlayer 操作需嚴格遵循狀態機,異常分支務必 reset()/release() 防止資源洩漏。
  • 錄音線程使用 Handler 切換主線程更新 UI,符合 Android 單線程模型。

總結

本文雙軌並行:前半部講解 Java 原型模式核心機制與最佳實踐;後半部提供生產級 Android 語音錄製控件完整源碼與架構分析。兩部分雖業務無關,均展示了「模式指導實現、代碼服務業務」的工程思維。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved