生活随笔
收集整理的這篇文章主要介紹了
安卓中的单例模式和工厂模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
單例模式
簡(jiǎn)單的來(lái)說(shuō),單例模式就是提供一個(gè)實(shí)例,并且提供一個(gè)全局的訪問(wèn)點(diǎn)。
適用場(chǎng)景:1.應(yīng)用中某個(gè)實(shí)例對(duì)象需要頻繁的被訪問(wèn)。
2.應(yīng)用中每次啟動(dòng)只會(huì)存在一個(gè)實(shí)例。
優(yōu)點(diǎn):內(nèi)存中只有一個(gè)實(shí)例,減少了內(nèi)存的開(kāi)銷(xiāo),避免對(duì)資源的多重占用。
常用的三種方式:
(1)懶漢式
public class ?A{
?
private static A instance = null;
???
private A(){
? ? ? ? ?}
???
public static A getInstance(){
if(instance == null){
instance = new A()
? ? ? ? }
return instance;
? ? }
}
調(diào)用:
[java]?view plain
?copy ? Singleton.getInstance().method(); ?
優(yōu)點(diǎn):延遲加載(需要時(shí)在加載)
缺點(diǎn):線程不安全,在多線程中很容易出現(xiàn)不同步的情況
(2)加同步鎖
既然線程不安全,那就加上同步鎖,一種加法如下:
[java]?view plain
?copy ? ?? ?public?static?synchronized?Singleton?getInstance()?{?? ?????if?(instance?==?null)?{?? ?????????instance?=?new?Singleton();?? ?????}?? ?????return?instance;?? ?} ?
(3)內(nèi)部類(lèi)的實(shí)現(xiàn)
內(nèi)部類(lèi)是一種好的實(shí)現(xiàn)方式,可以推薦使用一下:
[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");?? ????}?? }??
調(diào)用:
[java]?view plain
?copy ? SingletonInner.getInstance().method();??
優(yōu)點(diǎn):延遲加載,線程安全(java中class加載時(shí)互斥的),也減少了內(nèi)存消耗
工廠模式
簡(jiǎn)單來(lái)說(shuō)就是給外部批量提供相同或者不同的產(chǎn)品,而外部不需要關(guān)心工廠是如何創(chuàng)建一個(gè)復(fù)雜產(chǎn)品的過(guò)程。所以工廠模式降低模塊間的耦合,同時(shí)提高擴(kuò)展性。
(1)標(biāo)準(zhǔn)工廠模式
? ?首先先介紹一下標(biāo)準(zhǔn)的工廠方法模式,不帶任何的變種.以工廠生產(chǎn)不同操作系統(tǒng)的手機(jī)為例.
? ? ? ?建立一個(gè)產(chǎn)品接口,提供一個(gè)獲取系統(tǒng)信息的方法.
[java]?view plain
?copy ? ? ?? public?interface?IPhone?{?? ????public?void?getOS();?? }??
? ? ? ?再根據(jù)IPhone接口實(shí)現(xiàn)Android,IOS,Blackberry三種手機(jī).
[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");?? ????}?? }??
? ? ? ?標(biāo)準(zhǔn)的工廠方法模式都需要有抽象的工廠接口或者基類(lèi).
[java]?view plain
?copy public?abstract?class?IGenerator?{?? ????public?abstract?IPhone?generatePhone(String?flag)?throws?Exception;?? }??
? ? ? ?通過(guò)基類(lèi)或者接口來(lái)實(shí)現(xiàn)真實(shí)的工廠類(lèi),這里需要注意跟簡(jiǎn)單工廠模式的不同,標(biāo)準(zhǔn)的工廠方法模式里面一個(gè)工廠只生產(chǎn)一個(gè)產(chǎn)品,所以這里要根據(jù)產(chǎn)品的種類(lèi)劃分出來(lái)三個(gè)工廠,分別生產(chǎn)三種不同的產(chǎn)品.這種設(shè)計(jì)思想非常契合單一職責(zé)原則.
[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();?? ????}?? }??
? ? ? ?在客戶(hù)端從工廠中獲得產(chǎn)品并使用的過(guò)程中都是通過(guò)接口進(jìn)行訪問(wèn)的,在創(chuàng)建產(chǎn)品的階段有效得降低了使用者和產(chǎn)品之間的耦合度.
[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)簡(jiǎn)單工廠模式,也稱(chēng)為靜態(tài)工廠方法模式。它不能通過(guò)繼承進(jìn)行擴(kuò)展,如果有新增的產(chǎn)品,就只能在靜態(tài)方法里面做修改。
? ? ? ?因?yàn)檫@是靜態(tài)工廠方法模式,所以工廠類(lèi)就沒(méi)有接口或者虛基類(lèi)來(lái)提供抽象.通過(guò)不同的Flag來(lái)初始化不同的產(chǎn)品.
[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;?? ????}?? }??
? ? ? ?對(duì)外部來(lái)說(shuō)要使用工廠只需要把目標(biāo)產(chǎn)品類(lèi)傳過(guò)去就行了.運(yùn)行結(jié)果跟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();?
總結(jié)
以上是生活随笔為你收集整理的安卓中的单例模式和工厂模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。