L08B抽象工廠模式_第1頁(yè)
L08B抽象工廠模式_第2頁(yè)
L08B抽象工廠模式_第3頁(yè)
L08B抽象工廠模式_第4頁(yè)
L08B抽象工廠模式_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

L08B抽象工廠(AbstractFactory)模式

wxz面向?qū)ο笤O(shè)計(jì)方法(UML)引言抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠模式的簡(jiǎn)略類圖如下所示。涂有陰影的兩個(gè)具體產(chǎn)品屬于同一個(gè)產(chǎn)品族。問(wèn)題抽象工廠模式面對(duì)的問(wèn)題是多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)的系統(tǒng)設(shè)計(jì)。抽象工廠模式與工廠方法模式的最大區(qū)別就在于,工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu);而抽象工廠模式則需要面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。下圖給出了一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。下圖則給出了多個(gè)相平行的產(chǎn)品等級(jí)結(jié)構(gòu)的例子。產(chǎn)品族為了方便引進(jìn)抽象工廠模式,特地引進(jìn)一個(gè)新的概念:產(chǎn)品族(ProductFamily)。所謂產(chǎn)品族,是指位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。比如在下圖中,箭頭所指就是三個(gè)功能相關(guān)聯(lián)的產(chǎn)品,它們位于三個(gè)不同的等級(jí)結(jié)構(gòu)中的相同位置上,組成一個(gè)產(chǎn)品族。顯然,每一個(gè)產(chǎn)品族中含有產(chǎn)品的數(shù)目,與產(chǎn)品等級(jí)結(jié)構(gòu)的數(shù)目是相等的。產(chǎn)品的等級(jí)結(jié)構(gòu)和產(chǎn)品族將產(chǎn)品按照不同方向劃分,形成一個(gè)二維的坐標(biāo)系,如下圖所示。在坐標(biāo)圖中有四個(gè)產(chǎn)品族,分布于三個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中。在上面的坐標(biāo)圖中,橫軸表示產(chǎn)品等級(jí)結(jié)構(gòu),縱軸表示產(chǎn)品族??梢钥闯?,圖中一共有四個(gè)產(chǎn)品族,分布于三個(gè)不同的產(chǎn)品等級(jí)結(jié)構(gòu)中。只要指明一個(gè)產(chǎn)品所處的產(chǎn)品族以及它所屬的等級(jí)結(jié)構(gòu),就可以惟一地確定這個(gè)產(chǎn)品。引進(jìn)抽象工廠模式上面所給出的三個(gè)不同的等級(jí)結(jié)構(gòu)具有平行的結(jié)構(gòu)。因此,如果采用工廠方法模式,就勢(shì)必要使用三個(gè)獨(dú)立的工廠等級(jí)結(jié)構(gòu)來(lái)對(duì)付這三個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。由于這三個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)的相似性,會(huì)導(dǎo)致三個(gè)平行的工廠等級(jí)結(jié)構(gòu)。隨著產(chǎn)品等級(jí)結(jié)構(gòu)的數(shù)目增加,工廠方法模式所給出的工廠等級(jí)結(jié)構(gòu)的數(shù)目也會(huì)隨之增加。那么,是否可以使用同一個(gè)工廠等級(jí)結(jié)構(gòu)來(lái)對(duì)付這些相同或者極為相似的產(chǎn)品等級(jí)結(jié)構(gòu)呢?當(dāng)然是可以的,而這就是抽象工廠模式的好處。同一個(gè)工廠等級(jí)結(jié)構(gòu)負(fù)責(zé)三個(gè)不同產(chǎn)品等級(jí)結(jié)構(gòu)中的產(chǎn)品對(duì)象的創(chuàng)建,如下圖所示,圖中的虛線代表創(chuàng)建關(guān)系。可以看出,一個(gè)工廠等級(jí)結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級(jí)結(jié)構(gòu)的一個(gè)產(chǎn)品族中的所有對(duì)象;顯然,這時(shí)候抽象工廠模式比工廠方法模式更有效率??梢钥闯觯瑢?duì)應(yīng)于每一個(gè)產(chǎn)品族都有一個(gè)具體工廠。而每一個(gè)具體工廠負(fù)責(zé)創(chuàng)建屬于同一個(gè)產(chǎn)品族、但是分屬于不同等級(jí)結(jié)構(gòu)的產(chǎn)品。抽象工廠模式的結(jié)構(gòu)通過(guò)使用抽象工廠模式,可以處理具有相同(或者相似)等級(jí)結(jié)構(gòu)的多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象創(chuàng)建問(wèn)題。比如下面就是兩個(gè)具有相同等級(jí)結(jié)構(gòu)的產(chǎn)品等級(jí)結(jié)構(gòu)A和產(chǎn)品等級(jí)結(jié)構(gòu)B的結(jié)構(gòu)圖。如果使用坐標(biāo)圖描述的話,會(huì)看到在圖上出現(xiàn)兩個(gè)等級(jí)結(jié)構(gòu)A和B,以及兩個(gè)產(chǎn)品族1和2。如下圖所示。在下面的圖中,每一個(gè)坐標(biāo)點(diǎn)都代表一個(gè)具體產(chǎn)品角色。如果使用工廠方法模式處理的話,就必須要有兩個(gè)獨(dú)立的工廠族。由于這兩個(gè)產(chǎn)品族的等級(jí)結(jié)構(gòu)相同,因此,使用同一個(gè)工廠族也可以處理這兩個(gè)產(chǎn)品族的創(chuàng)建問(wèn)題。后者就是抽象工廠模式,這樣根據(jù)產(chǎn)品角色的結(jié)構(gòu)圖,就不難給出工廠角色的結(jié)構(gòu)設(shè)計(jì)圖,如下圖所示。由于每個(gè)具體工廠角色都需要負(fù)責(zé)兩個(gè)不同等級(jí)結(jié)構(gòu)的產(chǎn)品對(duì)象的創(chuàng)建,因此每個(gè)工廠角色都需要提供兩個(gè)工廠方法,分別用于創(chuàng)建兩個(gè)等級(jí)結(jié)構(gòu)的產(chǎn)品。既然每個(gè)具體工廠角色都需要實(shí)現(xiàn)這兩個(gè)工廠方法,所以這種情況就具有一般性,不妨抽象出來(lái),移動(dòng)到抽象工廠角色Creator中加以聲明。產(chǎn)品等級(jí)結(jié)構(gòu)A和產(chǎn)品等級(jí)結(jié)構(gòu)B的結(jié)構(gòu)圖如下所示??梢钥闯?,每一個(gè)工廠角色都有兩個(gè)工廠方法,分別負(fù)責(zé)創(chuàng)建分屬不同產(chǎn)品等級(jí)結(jié)構(gòu)的產(chǎn)品對(duì)象。系統(tǒng)的設(shè)計(jì)采用抽象工廠模式設(shè)計(jì)出的系統(tǒng)類圖如下所示。從上圖可以看出,抽象工廠模式涉及到以下的角色。抽象工廠(AbstractFactory)角色:擔(dān)任這個(gè)角色的是工廠方法模式的核心,它是與應(yīng)用系統(tǒng)的商業(yè)邏輯無(wú)關(guān)的。通常使用Java接口或者抽象Java類實(shí)現(xiàn),而所有的具體工廠類必須實(shí)現(xiàn)這個(gè)Java接口或繼承這個(gè)抽象Java類。具體工廠類(ConreteFactory)角色:這個(gè)角色直接在客戶端的調(diào)用下創(chuàng)建產(chǎn)品的實(shí)例。這個(gè)角色含有選擇合適的產(chǎn)品對(duì)象的邏輯,而這個(gè)邏輯是與應(yīng)用系統(tǒng)的商業(yè)邏輯緊密相關(guān)的。通常使用具體Java類實(shí)現(xiàn)這個(gè)角色。抽象產(chǎn)品(AbstractProduct)角色:擔(dān)任這個(gè)角色的類是工廠方法模式所創(chuàng)建的對(duì)象的父類,或它們共同擁有的接口。通常使用Java接口或者抽象Java類實(shí)現(xiàn)這一角色。具體產(chǎn)品(ConcreteProduct)角色:抽象工廠模式所創(chuàng)建的任何產(chǎn)品對(duì)象都是某一個(gè)具體產(chǎn)品類的實(shí)例。這是客戶端最終需要的東西,其內(nèi)部一定充滿了應(yīng)用系統(tǒng)的商業(yè)邏輯。通常使用具體Java類實(shí)現(xiàn)這個(gè)角色。源代碼下面給出這個(gè)系統(tǒng)所有的源代碼。首先給出工廠角色的源代碼,可以看出,抽象工廠角色規(guī)定出兩個(gè)工廠方法,分別提供兩個(gè)不同等級(jí)結(jié)構(gòu)的產(chǎn)品對(duì)象。代碼清單1:抽象產(chǎn)品角色的源代

publicinterfaceCreator{/***產(chǎn)品等級(jí)結(jié)構(gòu)A的工廠方法*/publicProductAfactoryA();/***產(chǎn)品等級(jí)結(jié)構(gòu)B的工廠方法*/publicProductBfactoryB();}下面給出具體工廠角色ConcreteCreator1的源代碼。這個(gè)具體工廠類實(shí)現(xiàn)了抽象工廠角色所要求的兩個(gè)工廠方法,分別提供兩個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中的某一個(gè)產(chǎn)品對(duì)象。代碼清單2:具體工廠類ConcreteCreator1的源代碼

publicclassConcreteCreator1implementsCreator{/***產(chǎn)品等級(jí)結(jié)構(gòu)A的工廠方法*/publicProductAfactoryA(){returnnewProductA1();}/***產(chǎn)品等級(jí)結(jié)構(gòu)B的工廠方法*/publicProductBfactoryB(){returnnewProductB1();}}一般而言,有多少個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),在工廠角色中就有對(duì)應(yīng)個(gè)數(shù)的個(gè)工廠方法。每一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中有多少具體產(chǎn)品,就有多少個(gè)產(chǎn)品族,也就會(huì)在工廠等級(jí)結(jié)構(gòu)中發(fā)現(xiàn)多少個(gè)具體工廠。下面給出具體工廠角色ConcreteCreator2的源代碼。這個(gè)具體工廠類實(shí)現(xiàn)了抽象工廠角色所要求的兩個(gè)工廠方法,分別提供兩個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中的另一個(gè)產(chǎn)品對(duì)象。代碼清單3:具體工廠類ConcreteCreator2的源代碼publicclassConcreteCreator2implementsCreator{/***產(chǎn)品等級(jí)結(jié)構(gòu)A的工廠方法*/publicProductAfactoryA(){returnnewProductA2();}/***產(chǎn)品等級(jí)結(jié)構(gòu)B的工廠方法*/publicProductBfactoryB(){returnnewProductB2();}}代碼清單4:下面是產(chǎn)品等級(jí)結(jié)構(gòu)A的源代碼

publicinterfaceProductA{}下面是屬于產(chǎn)品等級(jí)結(jié)構(gòu)A的具體產(chǎn)品類ProductA1的源代碼。這個(gè)具體產(chǎn)品實(shí)現(xiàn)了產(chǎn)品等級(jí)結(jié)構(gòu)A的抽象產(chǎn)品接口。代碼清單5:具體產(chǎn)品類ProductA1的源代碼

publicclassProductA1implementsProductA{publicProductA1(){}}下面是同樣屬于產(chǎn)品等級(jí)結(jié)構(gòu)A的具體產(chǎn)品類ProductA2的源代碼。這個(gè)具體產(chǎn)品也實(shí)現(xiàn)了產(chǎn)品等級(jí)結(jié)構(gòu)A的抽象產(chǎn)品接口。代碼清單6:具體產(chǎn)品類ProductA2的源代碼

publicclassProductA2implementsProductA{publicProductA2(){}}下面是產(chǎn)品等級(jí)結(jié)構(gòu)B的抽象產(chǎn)品角色,這個(gè)抽象產(chǎn)品角色也是由一個(gè)Java接口實(shí)現(xiàn)的。代碼清單7:抽象產(chǎn)品角色ProductB的源代碼

publicinterfaceProductB{}下面是屬于產(chǎn)品等級(jí)結(jié)構(gòu)B的具體產(chǎn)品類ProductB1的源代碼。這個(gè)具體產(chǎn)品實(shí)現(xiàn)了產(chǎn)品等級(jí)結(jié)構(gòu)B的抽象產(chǎn)品接口。代碼清單8:具體產(chǎn)品類ProductB1的源代碼publicclassProductB1implementsProductB{/***構(gòu)造函數(shù)*/publicProductB1(){}}下面是屬于產(chǎn)品等級(jí)結(jié)構(gòu)B的具體產(chǎn)品類ProductB2的源代碼。這個(gè)具體產(chǎn)品實(shí)現(xiàn)了產(chǎn)品等級(jí)結(jié)構(gòu)B的抽象產(chǎn)品接口。代碼清單9:具體產(chǎn)品類ProductB2的源代碼

publicclassProductB2implementsProductB{/***構(gòu)造函數(shù)*/publicProductB2(){}}在什么情形下應(yīng)當(dāng)使用抽象工廠模式文獻(xiàn)[GOF95]指出,在以下情況下應(yīng)當(dāng)考慮使用抽象工廠模式:(1)一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié)。這對(duì)于所有形態(tài)的工廠模式都是重要的;(2)這個(gè)系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品;(3)同屬于同一個(gè)產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須要在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來(lái);抽象工廠模式的應(yīng)用抽象工廠模式的起源或者說(shuō)最早的應(yīng)用,是用于創(chuàng)建分屬于不同操作系統(tǒng)的視窗構(gòu)件。比如,命令按鍵(Button)與文字框(Text)都是視窗構(gòu)件,在UNIX操作系統(tǒng)的視窗環(huán)境和Windows操作系統(tǒng)的視窗環(huán)境中,這兩個(gè)構(gòu)件有不同的本地實(shí)現(xiàn),它們的細(xì)節(jié)也有所不同。在每一個(gè)操作系統(tǒng)中,都有一個(gè)視窗構(gòu)件組成的構(gòu)件家族。在這里就是Button和Text組成的產(chǎn)品族。而每一個(gè)視窗構(gòu)件都構(gòu)成自己的等級(jí)結(jié)構(gòu),由一個(gè)抽象角色給出抽象的功能描述,而由具體子類給出不同操作系統(tǒng)下的具體實(shí)現(xiàn),如下圖所示。可以發(fā)現(xiàn)在上面的產(chǎn)品類圖中,有兩個(gè)產(chǎn)品的等級(jí)結(jié)構(gòu),分別是Button等級(jí)結(jié)構(gòu)和Text等級(jí)結(jié)構(gòu)。同時(shí)有兩個(gè)產(chǎn)品族,也就是UNIX產(chǎn)品族和Windows產(chǎn)品族。UNIX產(chǎn)品族由UnixButton和UnixText產(chǎn)品構(gòu)成;而Windows產(chǎn)品族由WinButton和WinText產(chǎn)品構(gòu)成。圖描述如下所示。系統(tǒng)對(duì)產(chǎn)品對(duì)象的創(chuàng)建需求由一個(gè)工廠的等級(jí)結(jié)構(gòu)滿足;其中有兩個(gè)具體工廠角色,即UnixFactory和WinFactory。其中UnixFactory對(duì)象負(fù)責(zé)創(chuàng)建Unix產(chǎn)品族中的產(chǎn)品,而WinFactory對(duì)象負(fù)責(zé)創(chuàng)建Windows產(chǎn)品族中的產(chǎn)品。這就是抽象工廠模式的應(yīng)用,抽象工廠模式的解決方案如下圖所示。例:abstractclassButton{publicabstractvoidpaint();}classWinButtonextendsButton{publicvoidpaint(){System.out.println("I'maWinButton");}}classOSXButtonextendsButton{publicvoidpaint(){System.out.println("I'manOSXButton");}}abstractclassGUIFactory{

publicstaticGUIFactorygetFactory(){intsys=readFromConfigFile(“OS_TYPE”);//從配置文件中讀取操作系統(tǒng)類型

if(sys==0){returnnewWinFactory();}else{returnnewOSXFactory();}}publicabstractButtoncreateButton();}classWinFactoryextendsGUIFactory{//生成Windows界面的工廠

publicButtoncreateButton(){returnnewWinButton();}}classOSXFactoryextendsGUIFactory{//生成OSX界面的工廠

publicButtoncreateButton(){returnnewOSXButton();}}publicclassApplication{publicstaticvoidmain(String[]args){GUIFactoryfactory=GUIFactory.getFactory();Buttonbutton=factory.createButton();button.paint();}}抽象工廠模式在農(nóng)場(chǎng)系統(tǒng)中的實(shí)現(xiàn)農(nóng)場(chǎng)公司再次面臨新的大發(fā)展,一項(xiàng)重要的工作,就是引進(jìn)塑料大棚技術(shù),在大棚里種植熱帶(Tropical)和亞熱帶的水果和蔬菜。因此,在這個(gè)系統(tǒng)里面,產(chǎn)品分成兩個(gè)等級(jí)結(jié)構(gòu):水果(Fruit)和蔬菜(Veggie)。下面就是水果(Fruit)的類圖。下面則是蔬菜(Veggie)的類圖。下面是描述這個(gè)系統(tǒng)的產(chǎn)品角色的相圖??梢钥闯觯@個(gè)系統(tǒng)的產(chǎn)品可以分成兩個(gè)等級(jí)結(jié)構(gòu):Fruit和Veggie,以及兩個(gè)產(chǎn)品族:Tropical和Northern。坐標(biāo)圖上出現(xiàn)了四個(gè)坐標(biāo)點(diǎn),分別代表TropicalFruit(熱帶水果)、TropicalVeggie(熱帶蔬菜)、NorthernFruit(北方水果)以及NorthernVeggie(北方蔬菜)等四個(gè)產(chǎn)品。顯然可以使用一個(gè)工廠族來(lái)封裝它們的創(chuàng)建過(guò)程。這個(gè)工廠族的等級(jí)結(jié)構(gòu)應(yīng)當(dāng)與產(chǎn)品族的等級(jí)結(jié)構(gòu)完全平行,園丁等級(jí)結(jié)構(gòu)的類圖如下圖所示。系統(tǒng)所需要的是產(chǎn)品的實(shí)例,而工廠則是對(duì)產(chǎn)品創(chuàng)建過(guò)程的封裝。系統(tǒng)設(shè)計(jì)與抽象工廠模式的各個(gè)角色相對(duì)照,不難發(fā)現(xiàn),所謂各個(gè)園丁其實(shí)就是各個(gè)工廠角色,而蔬菜和水果角色則是產(chǎn)品角色。將抽象工廠模式應(yīng)用于農(nóng)場(chǎng)系統(tǒng)中,系統(tǒng)的設(shè)計(jì)圖如下所示。種在田間的北方作物與種在大棚的熱帶作物都是系統(tǒng)的產(chǎn)品,它們分屬于兩個(gè)產(chǎn)品族。顯然,北方作物是要種植在一起的,而大棚作物是要另外種植在一起的。這些分別體現(xiàn)在系統(tǒng)的設(shè)計(jì)上,就正好滿足了使用抽象工廠模式的第三個(gè)條件。代碼清單10:接口GardenerpublicinterfaceGardener{publicFruitcreatFruit();publicVeggiecreateVeggie();}NorthernGardener和TropicalGardener均是抽象工廠類Gardener的具體子類,也就是說(shuō)它們?nèi)际蔷唧w工廠類。代碼清單11:具體工廠類NorthernGardener

publicclassNorthernGardenerimplementsGardener{/***水果的工廠方法*/publicFruitcreateFruit(Stringname){returnnewNorthernFruit(name);}/***蔬菜的工廠方法*/publicVeggiecreateVeggie(Stringname){returnnewNorthernVeggie(name);}}代碼清單12:具體工廠類TropicalGardener

publicclassTropicalGardenerimplementsGardener{/***水果的工廠方法*/publicFruitcreateFruit(Stringname){returnnewTropicalFruit(name);}/***蔬菜的工廠方法*/publicVeggiecreateVeggie(Stringname){returnnewTropicalVeggie(name);}}顯然Veggie是一個(gè)接口。代碼清單13:接口VeggiepublicinterfaceVeggie{}北方的蔬菜NorthernVeggie應(yīng)當(dāng)實(shí)現(xiàn)Veggie接口。代碼清單14:具體產(chǎn)品類NorthernVeggie

publicclassNorthernVeggieimplementsVeggie{privateStringname;publicNorthernVeggie(Stringname){}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}}熱帶蔬菜TropicalVeggie也應(yīng)當(dāng)實(shí)現(xiàn)Veggie接口。代碼清單15:具體產(chǎn)品類TropicalVeggiepublicclassTropicalVeggieimplementsVeggie{privateStringname;/***構(gòu)造子*/publicTropicalVeggie(Stringname){=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}}抽象產(chǎn)品角色Fruit有一個(gè)Java接口實(shí)現(xiàn),它的源代碼如下所示。代碼清單16:抽象產(chǎn)品角色Fruit的源代碼

publicinterfaceFruit{}而北方水果NorthernFruit類則實(shí)現(xiàn)了抽象水果接口Fruit。代碼清單17:抽象產(chǎn)品角色NorthernFruit的源代碼

publicclassNorthernFruitimplementsFruit{privateStringname;publicNorthernFruit(Stringname)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論