国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

抽象工廠模式的傾斜性和改進(jìn)設(shè)計(jì)研究

2015-09-01 13:50:18閆如海
關(guān)鍵詞:設(shè)計(jì)模式系統(tǒng)設(shè)計(jì)

閆如海

摘要:文章針對(duì)傳統(tǒng)的抽象工廠模式的傾斜性進(jìn)行了糾正,使得在生產(chǎn)不同產(chǎn)品族和不同產(chǎn)品等級(jí)結(jié)構(gòu)時(shí),新增產(chǎn)品等級(jí)結(jié)構(gòu)不必修改源碼,給出符合開(kāi)閉原則的設(shè)計(jì)方案,同時(shí)對(duì)抽象工廠的缺點(diǎn)做了改進(jìn)設(shè)計(jì),以適應(yīng)系統(tǒng)設(shè)計(jì)時(shí)搭建上層框架的需求。

關(guān)鍵詞:抽象工廠模式;傾斜性;設(shè)計(jì)模式;開(kāi)閉原則;系統(tǒng)設(shè)計(jì) 文獻(xiàn)標(biāo)識(shí)碼:A

中圖分類(lèi)號(hào):TP312 文章編號(hào):1009-2374(2015)33-0018-02 DOI:10.13535/j.cnki.11-4406/n.2015.33.010

1 概述

抽象工廠模式源于面向?qū)ο笤O(shè)計(jì)領(lǐng)域里的經(jīng)典教材《設(shè)計(jì)模式》,顧名思義,抽象工廠模式用于系統(tǒng)運(yùn)行時(shí)生產(chǎn)需要的對(duì)象,是一種創(chuàng)建型模式,在系統(tǒng)設(shè)計(jì)時(shí)是創(chuàng)建對(duì)象的核心模式。

對(duì)于使用抽象工廠模式增加新產(chǎn)品的等級(jí)結(jié)構(gòu),學(xué)者們普遍認(rèn)為必須要修改所有的工廠角色,只能以修改源碼的方式新增新產(chǎn)品的等級(jí)結(jié)構(gòu),說(shuō)明抽象工廠模式?jīng)]有很好支持開(kāi)閉原則(OCP),以一種傾斜的方式支持增加新的產(chǎn)品,它為新產(chǎn)品族的增加提供方便,而不能為新的產(chǎn)品等級(jí)結(jié)構(gòu)的增加提供這樣的方便。這種方式也已不能夠?yàn)橹圃鞓I(yè)信息化和服務(wù)化服務(wù),文中給出符合開(kāi)閉原則的設(shè)計(jì)方案,同時(shí)對(duì)抽象工廠的缺點(diǎn)做了改進(jìn)設(shè)計(jì),以適應(yīng)系統(tǒng)設(shè)計(jì)時(shí)搭建上層框架的需求。

2 新增產(chǎn)品等級(jí)結(jié)構(gòu)的設(shè)計(jì)

如果已有產(chǎn)品等級(jí)A和B,產(chǎn)品族1和2,需要增加產(chǎn)品等級(jí)結(jié)構(gòu)C可以按圖1所示進(jìn)行:

圖1 新增產(chǎn)品等級(jí)結(jié)構(gòu)的設(shè)計(jì)類(lèi)圖

圖中新增兩大類(lèi)內(nèi)容,由虛線標(biāo)注:

第一,新增的產(chǎn)品等級(jí)結(jié)構(gòu)C位于圖下方,由三個(gè)類(lèi)組成:AbstractProductC、ProductC1、ProductC2。其中ProductC1、ProductC2都繼承于AbstractProductC。

第二,工廠,這個(gè)是添加產(chǎn)品等級(jí)結(jié)構(gòu)最重要的部分,由三部分組成:接口AbstractFactoryC1、類(lèi)ConcreteFactoryC1、類(lèi)ConcreteFactoryC2。

下面給出三個(gè)工廠的源碼:

工廠接口AbstractFactoryC.java

public interface AbstractFactoryC extends AbstractFactory{

AbstractProductC createProductC();

}

實(shí)現(xiàn)工廠ConcreteFactoryC1.java

public class ConcreteFactoryC1 extends ConcreteFactory1 implements AbstractFactoryC{

@Override

public AbstractProductC createProductC(){

return new ProductC1();

}

}

實(shí)現(xiàn)工廠ConcreteFactoryC2.java

public class ConcreteFactoryC2 extends ConcreteFactory2 implements AbstractFactoryC{

@Override

public AbstractProductC createProductC(){

return new ProductC2();

}

}

第一,新增的工廠接口AbstractFactoryC繼承于AbstractFactory,接口AbstractFactoryC內(nèi)新增了生產(chǎn)產(chǎn)品等級(jí)結(jié)構(gòu)C的方法CreateProductC(),返回的類(lèi)型是產(chǎn)品等級(jí)C。

第二,新增兩個(gè)工廠類(lèi)ConcreteFactoryC1和ConcreteFactoryC2,其中ConcreteFactoryC1繼承了ConcreteFactory1類(lèi),從上面可以知道,ConcreteFactory生產(chǎn)了產(chǎn)品族A1和B1,因?yàn)槔^承的關(guān)系,ConcreteFactoryC1也有了這些功能。并且在類(lèi)中生產(chǎn)了產(chǎn)品C1,支持了產(chǎn)品族1的生產(chǎn)。同理ConcreteFactoryC2也完成了產(chǎn)品族2的生產(chǎn)功能。

第三,完成客戶(hù)端的調(diào)用,如下:

public class Client{

public static void main(String[]args){

AbstractFactoryC cf1=new ConcreteFactoryC1();

cf1.createProductC();

AbstractFactoryC cf2=new ConcreteFactoryC2();

cf2.createProductC();

}

}

cf1能夠生產(chǎn)對(duì)象C1,cf2可以生產(chǎn)對(duì)象C2。從這個(gè)設(shè)計(jì)可以看出沒(méi)有改動(dòng)圖1中任何接口和類(lèi)的源碼,完全符合開(kāi)閉原則(OCP),對(duì)系統(tǒng)內(nèi)新增功能以新增類(lèi)和接口方式完成。

3 抽象工廠模式改進(jìn)設(shè)計(jì)

從以上內(nèi)容可以看出抽象工廠模式并沒(méi)有在新增產(chǎn)品等級(jí)時(shí)的所謂傾斜性的問(wèn)題,但是這種模式還是有一些別的問(wèn)題。這里需要對(duì)這些問(wèn)題進(jìn)行改進(jìn):

第一,系統(tǒng)需要AbstractProduct產(chǎn)品的子類(lèi)時(shí)無(wú)法完成任務(wù)。在上面的設(shè)計(jì)中能看出,AbstractFactory依賴(lài)AbstractProductA,ConcreteFactory1只負(fù)責(zé)生產(chǎn)AbstractProductA的子類(lèi)ProductA,Client調(diào)用AbstractFactory后獲得AbstractProductA。如果Client需要ProductA繼承于AbstractProductA后新增的屬性或方法,這個(gè)模式就無(wú)法正常運(yùn)行,而ProductA中肯定有自己新定義的方法和屬性,否則不需要新增子類(lèi),而且這些方法和屬性必定會(huì)在系統(tǒng)某個(gè)地方使用,那么以工廠類(lèi)為唯一生產(chǎn)對(duì)象的入口設(shè)計(jì)方案還是需要進(jìn)行改進(jìn)。改進(jìn)的方法就是引入泛型。

第二,新增產(chǎn)品等級(jí)結(jié)構(gòu)時(shí)工廠一側(cè)的結(jié)構(gòu)不易維護(hù)。上面的設(shè)計(jì)中新增產(chǎn)品等級(jí)C必須新加入抽象工廠AbstractFactoryC,再加入實(shí)現(xiàn)類(lèi)ConcreteFactoryC1和ConcreteFactoryC2,產(chǎn)生了三個(gè)由繼承而來(lái)的類(lèi),繼承過(guò)多會(huì)造成耦合加劇,不利于維護(hù)。而且若新增次數(shù)增多則類(lèi)規(guī)模會(huì)急速增大,產(chǎn)生很多冗余代碼。這個(gè)問(wèn)題的根源在于工廠一側(cè)沒(méi)有進(jìn)行抽象設(shè)計(jì),僅僅簡(jiǎn)單地做了方法提取。

下面就這兩個(gè)問(wèn)題給出詳細(xì)的改進(jìn)設(shè)計(jì)。

圖2 改進(jìn)設(shè)計(jì)類(lèi)圖

新增接口IProduct,AbstractProductA和AbstractProductB都繼承于它。這樣就出現(xiàn)一個(gè)產(chǎn)品的基接口。

引入泛型,修改AbstractFactory代碼如下:

public interface AbstractFactory{

PRODUCT createProduct();

}

新增接口AbstractProductA:

public interface AbstractFactoryAextends AbstractFactory{}

這個(gè)接口產(chǎn)生對(duì)產(chǎn)品A的泛型依賴(lài),因?yàn)檫€是泛型,子類(lèi)在實(shí)現(xiàn)這個(gè)接口時(shí)就可以生產(chǎn)出AbstractProductA的子類(lèi)。

最后實(shí)現(xiàn)工廠ConcreteFactoryA,這里只給出生產(chǎn)A1產(chǎn)品的代碼,其余工廠類(lèi)似,不再一一贅述。

public class ConcreteFactoryA implements AbstractFactoryA{

@Override

public ProductA1 createProduct(){

return new ProductA1();

}

}

4 結(jié)語(yǔ)

本文通過(guò)對(duì)生產(chǎn)不同產(chǎn)品族和不同產(chǎn)品等級(jí)結(jié)構(gòu)中新增產(chǎn)品等級(jí)結(jié)構(gòu)的設(shè)計(jì)方案驗(yàn)證了抽象工廠模式不必修改源碼也可以增加產(chǎn)品等級(jí)結(jié)構(gòu),同時(shí)也指出了相關(guān)設(shè)計(jì)時(shí)的注意事項(xiàng),最后對(duì)抽象工廠的缺點(diǎn)做了改進(jìn)

設(shè)計(jì)。

參考文獻(xiàn)

[1] Erich Gamma,李英軍,等.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].北京:機(jī)械工業(yè)出版社,2009.

[2] 閻宏.Java與模式[M].北京:電子工業(yè)出版社,2002.

[3] 王翔.設(shè)計(jì)模式:基于C#的工程化實(shí)現(xiàn)及擴(kuò)展[M].北京:電子工業(yè)出版社,2009.

(責(zé)任編輯:周 瓊)

猜你喜歡
設(shè)計(jì)模式系統(tǒng)設(shè)計(jì)
仿生設(shè)計(jì)模式的創(chuàng)新應(yīng)用探索
玩具世界(2023年6期)2024-01-29 12:14:36
“1+1”作業(yè)設(shè)計(jì)模式的實(shí)踐探索
設(shè)計(jì)模式挖掘的有效性評(píng)估策略
三維協(xié)同設(shè)計(jì)模式下的航天項(xiàng)目管理實(shí)踐與展望
交通機(jī)電工程設(shè)計(jì)模式創(chuàng)新探討
一種基于SATA硬盤(pán)陣列的數(shù)據(jù)存儲(chǔ)與控制系統(tǒng)設(shè)計(jì)研究
工業(yè)熱電偶計(jì)量檢定系統(tǒng)設(shè)計(jì)
基于物聯(lián)網(wǎng)的煤礦智能倉(cāng)儲(chǔ)與物流運(yùn)輸管理系統(tǒng)設(shè)計(jì)與應(yīng)用
目標(biāo)特性測(cè)量雷達(dá)平臺(tái)建設(shè)構(gòu)想
科技視界(2016年22期)2016-10-18 14:34:34
星級(jí)酒店建筑電氣及弱電智能系統(tǒng)設(shè)計(jì)分析
东丽区| 吉安县| 石泉县| 井陉县| 蛟河市| 肥乡县| 壤塘县| 微山县| 黑龙江省| 霍林郭勒市| 彭泽县| 建水县| 姜堰市| 黑水县| 福泉市| 柳河县| 晋宁县| 海林市| 奎屯市| 成安县| 玉龙| 拉孜县| 马边| 海晏县| 贺兰县| 荣成市| 响水县| 衡水市| 平陆县| 新源县| 绵竹市| 冷水江市| 赣榆县| 乌恰县| 黎川县| 泾川县| 新昌县| 昌邑市| 韶关市| 蕲春县| 宣恩县|