生活随笔
收集整理的這篇文章主要介紹了
安卓中的单例模式和工厂模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
單例模式
簡單的來說,單例模式就是提供一個實例,并且提供一個全局的訪問點。
適用場景:1.應用中某個實例對象需要頻繁的被訪問。
2.應用中每次啟動只會存在一個實例。
優點:內存中只有一個實例,減少了內存的開銷,避免對資源的多重占用。
常用的三種方式:
(1)懶漢式
public class ?A{
?
private static A instance = null;
???
private A(){
? ? ? ? ?}
???
public static A getInstance(){
if(instance == null){
instance = new A()
? ? ? ? }
return instance;
? ? }
}
調用:
[java]?view plain
?copy ? Singleton.getInstance().method(); ?
優點:延遲加載(需要時在加載)
缺點:線程不安全,在多線程中很容易出現不同步的情況
(2)加同步鎖
既然線程不安全,那就加上同步鎖,一種加法如下:
[java]?view plain
?copy ? ?? ?public?static?synchronized?Singleton?getInstance()?{?? ?????if?(instance?==?null)?{?? ?????????instance?=?new?Singleton();?? ?????}?? ?????return?instance;?? ?} ?
(3)內部類的實現
內部類是一種好的實現方式,可以推薦使用一下:
[java]?view plain
?copy ? public?class?SingletonInner?{?? ?? ????? ? ? ? ? ? ?? ????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 ? ? ?? 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();?
總結
以上是生活随笔為你收集整理的安卓中的单例模式和工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。