999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

抽象工廠模式的傾斜性和改進設計研究

2015-09-01 13:50:18閆如海
中國高新技術企業 2015年33期

閆如海

摘要:文章針對傳統的抽象工廠模式的傾斜性進行了糾正,使得在生產不同產品族和不同產品等級結構時,新增產品等級結構不必修改源碼,給出符合開閉原則的設計方案,同時對抽象工廠的缺點做了改進設計,以適應系統設計時搭建上層框架的需求。

關鍵詞:抽象工廠模式;傾斜性;設計模式;開閉原則;系統設計 文獻標識碼:A

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

1 概述

抽象工廠模式源于面向對象設計領域里的經典教材《設計模式》,顧名思義,抽象工廠模式用于系統運行時生產需要的對象,是一種創建型模式,在系統設計時是創建對象的核心模式。

對于使用抽象工廠模式增加新產品的等級結構,學者們普遍認為必須要修改所有的工廠角色,只能以修改源碼的方式新增新產品的等級結構,說明抽象工廠模式沒有很好支持開閉原則(OCP),以一種傾斜的方式支持增加新的產品,它為新產品族的增加提供方便,而不能為新的產品等級結構的增加提供這樣的方便。這種方式也已不能夠為制造業信息化和服務化服務,文中給出符合開閉原則的設計方案,同時對抽象工廠的缺點做了改進設計,以適應系統設計時搭建上層框架的需求。

2 新增產品等級結構的設計

如果已有產品等級A和B,產品族1和2,需要增加產品等級結構C可以按圖1所示進行:

圖1 新增產品等級結構的設計類圖

圖中新增兩大類內容,由虛線標注:

第一,新增的產品等級結構C位于圖下方,由三個類組成:AbstractProductC、ProductC1、ProductC2。其中ProductC1、ProductC2都繼承于AbstractProductC。

第二,工廠,這個是添加產品等級結構最重要的部分,由三部分組成:接口AbstractFactoryC1、類ConcreteFactoryC1、類ConcreteFactoryC2。

下面給出三個工廠的源碼:

工廠接口AbstractFactoryC.java

public interface AbstractFactoryC extends AbstractFactory{

AbstractProductC createProductC();

}

實現工廠ConcreteFactoryC1.java

public class ConcreteFactoryC1 extends ConcreteFactory1 implements AbstractFactoryC{

@Override

public AbstractProductC createProductC(){

return new ProductC1();

}

}

實現工廠ConcreteFactoryC2.java

public class ConcreteFactoryC2 extends ConcreteFactory2 implements AbstractFactoryC{

@Override

public AbstractProductC createProductC(){

return new ProductC2();

}

}

第一,新增的工廠接口AbstractFactoryC繼承于AbstractFactory,接口AbstractFactoryC內新增了生產產品等級結構C的方法CreateProductC(),返回的類型是產品等級C。

第二,新增兩個工廠類ConcreteFactoryC1和ConcreteFactoryC2,其中ConcreteFactoryC1繼承了ConcreteFactory1類,從上面可以知道,ConcreteFactory生產了產品族A1和B1,因為繼承的關系,ConcreteFactoryC1也有了這些功能。并且在類中生產了產品C1,支持了產品族1的生產。同理ConcreteFactoryC2也完成了產品族2的生產功能。

第三,完成客戶端的調用,如下:

public class Client{

public static void main(String[]args){

AbstractFactoryC cf1=new ConcreteFactoryC1();

cf1.createProductC();

AbstractFactoryC cf2=new ConcreteFactoryC2();

cf2.createProductC();

}

}

cf1能夠生產對象C1,cf2可以生產對象C2。從這個設計可以看出沒有改動圖1中任何接口和類的源碼,完全符合開閉原則(OCP),對系統內新增功能以新增類和接口方式完成。

3 抽象工廠模式改進設計

從以上內容可以看出抽象工廠模式并沒有在新增產品等級時的所謂傾斜性的問題,但是這種模式還是有一些別的問題。這里需要對這些問題進行改進:

第一,系統需要AbstractProduct產品的子類時無法完成任務。在上面的設計中能看出,AbstractFactory依賴AbstractProductA,ConcreteFactory1只負責生產AbstractProductA的子類ProductA,Client調用AbstractFactory后獲得AbstractProductA。如果Client需要ProductA繼承于AbstractProductA后新增的屬性或方法,這個模式就無法正常運行,而ProductA中肯定有自己新定義的方法和屬性,否則不需要新增子類,而且這些方法和屬性必定會在系統某個地方使用,那么以工廠類為唯一生產對象的入口設計方案還是需要進行改進。改進的方法就是引入泛型。

第二,新增產品等級結構時工廠一側的結構不易維護。上面的設計中新增產品等級C必須新加入抽象工廠AbstractFactoryC,再加入實現類ConcreteFactoryC1和ConcreteFactoryC2,產生了三個由繼承而來的類,繼承過多會造成耦合加劇,不利于維護。而且若新增次數增多則類規模會急速增大,產生很多冗余代碼。這個問題的根源在于工廠一側沒有進行抽象設計,僅僅簡單地做了方法提取。

下面就這兩個問題給出詳細的改進設計。

圖2 改進設計類圖

新增接口IProduct,AbstractProductA和AbstractProductB都繼承于它。這樣就出現一個產品的基接口。

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

public interface AbstractFactory{

PRODUCT createProduct();

}

新增接口AbstractProductA:

public interface AbstractFactoryAextends AbstractFactory{}

這個接口產生對產品A的泛型依賴,因為還是泛型,子類在實現這個接口時就可以生產出AbstractProductA的子類。

最后實現工廠ConcreteFactoryA,這里只給出生產A1產品的代碼,其余工廠類似,不再一一贅述。

public class ConcreteFactoryA implements AbstractFactoryA{

@Override

public ProductA1 createProduct(){

return new ProductA1();

}

}

4 結語

本文通過對生產不同產品族和不同產品等級結構中新增產品等級結構的設計方案驗證了抽象工廠模式不必修改源碼也可以增加產品等級結構,同時也指出了相關設計時的注意事項,最后對抽象工廠的缺點做了改進

設計。

參考文獻

[1] Erich Gamma,李英軍,等.設計模式:可復用面向對象軟件的基礎[M].北京:機械工業出版社,2009.

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

[3] 王翔.設計模式:基于C#的工程化實現及擴展[M].北京:電子工業出版社,2009.

(責任編輯:周 瓊)

主站蜘蛛池模板: 亚洲人成网址| 超碰精品无码一区二区| 久久77777| www.国产福利| 日韩高清中文字幕| 另类专区亚洲| 亚洲第一视频免费在线| 久久99精品久久久久久不卡| 午夜国产在线观看| 国产玖玖玖精品视频| 欧美乱妇高清无乱码免费| 欧美一区二区人人喊爽| 91综合色区亚洲熟妇p| 亚洲AV无码乱码在线观看代蜜桃| 国产在线八区| 天天躁夜夜躁狠狠躁图片| 亚洲日韩在线满18点击进入| 1769国产精品视频免费观看| 99久久精品久久久久久婷婷| 国产三级精品三级在线观看| 婷婷综合缴情亚洲五月伊| 欧美视频在线播放观看免费福利资源 | 国产成人高清精品免费软件| 中文字幕永久在线看| 亚洲天堂免费| 婷婷六月在线| 日本一区二区三区精品视频| 国产91小视频在线观看| 亚洲a级在线观看| 亚洲综合色在线| 国产成人综合网在线观看| 99尹人香蕉国产免费天天拍| 国产小视频免费观看| 欧美97色| 中文字幕丝袜一区二区| 国产青榴视频在线观看网站| 韩国v欧美v亚洲v日本v| 先锋资源久久| 超碰精品无码一区二区| 夜色爽爽影院18禁妓女影院| 国产又黄又硬又粗| 精品无码人妻一区二区| 国产99在线观看| 欧美区一区| 亚洲人成人无码www| 国产呦精品一区二区三区下载 | 国产成年无码AⅤ片在线| 又大又硬又爽免费视频| 91无码人妻精品一区| 无码一区18禁| 亚洲娇小与黑人巨大交| 粉嫩国产白浆在线观看| a毛片在线免费观看| 国产无码高清视频不卡| 国产欧美综合在线观看第七页| 26uuu国产精品视频| 欧美精品xx| 欧美自拍另类欧美综合图区| 免费一级α片在线观看| 国产91蝌蚪窝| 久久亚洲黄色视频| 日韩一区精品视频一区二区| 久久婷婷六月| 免费人成在线观看成人片| 午夜无码一区二区三区在线app| 亚洲精品另类| 日韩高清在线观看不卡一区二区| 最近最新中文字幕在线第一页| 国产亚洲精品无码专| 国产午夜精品鲁丝片| 99ri国产在线| 国产精品久久久精品三级| 久久久久久久蜜桃| 精品福利网| 天天婬欲婬香婬色婬视频播放| 亚洲综合精品香蕉久久网| 欧洲欧美人成免费全部视频| 欧洲成人免费视频| 久久久久久久97| 国产精品视频猛进猛出| 内射人妻无码色AV天堂| 国产噜噜噜视频在线观看|