日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓中的单例模式和工厂模式

發布時間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓中的单例模式和工厂模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單例模式

簡單的來說,單例模式就是提供一個實例,并且提供一個全局的訪問點。

適用場景:1.應用中某個實例對象需要頻繁的被訪問。

2.應用中每次啟動只會存在一個實例。

優點:內存中只有一個實例,減少了內存的開銷,避免對資源的多重占用。

常用的三種方式:

(1)懶漢式

public class ?A{

/*?持有私有靜態實例,防止被引用,此處賦值為null,目的是實現延遲加載?*/?

private static A instance = null;

?/*?私有構造方法,防止被實例化?*/??

private A(){

? ? ? ? ?}

?/*?1:懶漢式,靜態工程方法,創建實例?*/??

public static A getInstance(){

if(instance == null){

instance = new A()

? ? ? ? }

return instance;

? ? }

}

調用: [java]?view plain?copy ?
  • Singleton.getInstance().method(); ?
  • 優點:延遲加載(需要時在加載)

    缺點:線程不安全,在多線程中很容易出現不同步的情況

    (2)加同步鎖

    既然線程不安全,那就加上同步鎖,一種加法如下:

    [java]?view plain?copy ?
  • /*2.懶漢式變種,解決線程安全問題**/??
  • ?public?static?synchronized?Singleton?getInstance()?{??
  • ?????if?(instance?==?null)?{??
  • ?????????instance?=?new?Singleton();??
  • ?????}??
  • ?????return?instance;??
  • ?} ?

  • (3)內部類的實現

    內部類是一種好的實現方式,可以推薦使用一下:

    [java]?view plain?copy ?
  • public?class?SingletonInner?{??
  • ??
  • ????/**?
  • ?????*?內部類實現單例模式?
  • ?????*?延遲加載,減少內存開銷?
  • ?????*??
  • ?????*?@author?xuzhaohu?
  • ?????*??
  • ?????*/??
  • ????private?static?class?SingletonHolder?{??
  • ????????private?static?SingletonInner?instance?=?new?SingletonInner();??
  • ????}??
  • ??
  • ????/**?
  • ?????*?私有的構造函數?
  • ?????*/??
  • ????private?SingletonInner()?{??
  • ??
  • ????}??
  • ??
  • ????public?static?SingletonInner?getInstance()?{??
  • ????????return?SingletonHolder.instance;??
  • ????}??
  • ??
  • ????protected?void?method()?{??
  • ????????System.out.println("SingletonInner");??
  • ????}??
  • }??
  • 調用:

    [java]?view plain?copy ?
  • SingletonInner.getInstance().method();??
  • 優點:延遲加載,線程安全(java中class加載時互斥的),也減少了內存消耗

    工廠模式

    簡單來說就是給外部批量提供相同或者不同的產品,而外部不需要關心工廠是如何創建一個復雜產品的過程。所以工廠模式降低模塊間的耦合,同時提高擴展性。

    (1)標準工廠模式

    ? ?首先先介紹一下標準的工廠方法模式,不帶任何的變種.以工廠生產不同操作系統的手機為例.

    ? ? ? ?建立一個產品接口,提供一個獲取系統信息的方法.

    [java]?view plain?copy
  • /**?
  • ?*?Created?by?jesse?on?15-8-17.?
  • ?*/??
  • public?interface?IPhone?{??
  • ????public?void?getOS();??
  • }??
  • ? ? ? ?再根據IPhone接口實現Android,IOS,Blackberry三種手機.

    [java]?view plain?copy
  • public?class?AndroidPhone?implements?IPhone?{??
  • ????private?final?String?TAG?=?AndroidPhone.class.getSimpleName();??
  • ????@Override??
  • ????public?void?getOS()?{??
  • ????????Log.i(TAG,?"im?Android");??
  • ????}??
  • }??
  • public?class?IosPhone?implements?IPhone?{??
  • ????private?final?String?TAG?=?IosPhone.class.getSimpleName();??
  • ????@Override??
  • ????public?void?getOS()?{??
  • ????????Log.i(TAG,?"im?IOS");??
  • ????}??
  • }??
  • public?class?BlackBerryPhone?implements?IPhone?{??
  • ????private?final?String?TAG?=?BlackBerryPhone.class.getSimpleName();??
  • ????@Override??
  • ????public?void?getOS()?{??
  • ????????Log.i(TAG,?"im?BlackBerry");??
  • ????}??
  • }??
  • ? ? ? ?標準的工廠方法模式都需要有抽象的工廠接口或者基類.

    [java]?view plain?copy
  • public?abstract?class?IGenerator?{??
  • ????public?abstract?IPhone?generatePhone(String?flag)?throws?Exception;??
  • }??
  • ? ? ? ?通過基類或者接口來實現真實的工廠類,這里需要注意跟簡單工廠模式的不同,標準的工廠方法模式里面一個工廠只生產一個產品,所以這里要根據產品的種類劃分出來三個工廠,分別生產三種不同的產品.這種設計思想非常契合單一職責原則.

    [java]?view plain?copy
  • public?class?AndroidGenerator?extends?IGenerator?{??
  • ????@Override??
  • ????public?IPhone?generatePhone()?{??
  • ????????return?new?AndroidPhone();??
  • ????}??
  • }??
  • public?class?IOSGenerator?extends?IGenerator?{??
  • ????@Override??
  • ????public?IPhone?generatePhone()?{??
  • ????????return?new?IosPhone();??
  • ????}??
  • }??
  • public?class?BlackberryGenerator?extends?IGenerator?{??
  • ????@Override??
  • ????public?IPhone?generatePhone()?{??
  • ????????return?new?BlackBerryPhone();??
  • ????}??
  • }??
  • ? ? ? ?在客戶端從工廠中獲得產品并使用的過程中都是通過接口進行訪問的,在創建產品的階段有效得降低了使用者和產品之間的耦合度.

    [java]?view plain?copy
  • IPhone?android,?ios,?bb;??
  • IGenerator?androidGenerator,?iosGenerator,?bbGenerator;??
  • androidGenerator?=?new?AndroidGenerator();??
  • iosGenerator?=?new?IOSGenerator();??
  • bbGenerator?=?new?BlackberryGenerator();??
  • android?=?androidGenerator.generatePhone();??
  • ios?=?iosGenerator.generatePhone();??
  • bb?=?bbGenerator.generatePhone();??
  • android.getOS();??
  • ios.getOS();??
  • bb.getOS(); ?
  • (2)簡單工廠模式,也稱為靜態工廠方法模式。它不能通過繼承進行擴展,如果有新增的產品,就只能在靜態方法里面做修改。

    ? ? ? ?因為這是靜態工廠方法模式,所以工廠類就沒有接口或者虛基類來提供抽象.通過不同的Flag來初始化不同的產品.

    [java]?view plain?copy
  • public?class?PhoneGenerator{??
  • ????public?final?static?String?GENERATE_IOS?=?"generate_ios";??
  • ????public?final?static?String?GENERATE_ANDROID?=?"generate_android";??
  • ????public?final?static?String?GENERATE_BLACKBERRY?=?"generate_blackberry";??
  • ??
  • ????public?static?IPhone?generatePhone(String?flag)?throws?Exception?{??
  • ????????IPhone?iPhone?=?null;??
  • ????????switch?(flag){??
  • ????????????case?GENERATE_ANDROID:??
  • ????????????????iPhone?=??new?AndroidPhone();??
  • ????????????????break;??
  • ????????????case?GENERATE_IOS:??
  • ????????????????iPhone?=??new?IosPhone();??
  • ????????????????break;??
  • ????????????case?GENERATE_BLACKBERRY:??
  • ????????????????iPhone?=??new?BlackBerryPhone();??
  • ????????????????break;??
  • ????????????default:??
  • ????????????????throw?new?Exception("UNDEFINED?FLAG");??
  • ????????}??
  • ????????return?iPhone;??
  • ????}??
  • }??
  • ? ? ? ?對外部來說要使用工廠只需要把目標產品類傳過去就行了.運行結果跟1)中的是一樣的.

    [java]?view plain?copy
  • IPhone?android,?ios,?bb;??
  • android?=?PhoneGenerator.generatePhone(PhoneGenerator.GENERATE_ANDROID);??
  • ios?=?PhoneGenerator.generatePhone(PhoneGenerator.GENERATE_IOS);??
  • bb?=?PhoneGenerator.generatePhone(PhoneGenerator.GENERATE_BLACKBERRY);??
  • android.getOS();??
  • ios.getOS();??
  • bb.getOS();?









  • 總結

    以上是生活随笔為你收集整理的安卓中的单例模式和工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。