全民快乐8

你当前所在位置:全民快乐8 > IT技术探讨 > Java软件开发常用的设计模式汇总

Java软件开发常用的设计模式汇总

单例模式

 

JIANDANDIANSHUO,JIUSHIYIGEYINGYONGCHENGXUZHONG,MOUGELEIDESHILIDUIXIANGZHIYOUYIGE,NIMEIYOUBANFAQUnew,YINWEIGOUZAOQISHIBEIprivateXIUSHIDE,YIBANTONGGUOgetInstance()DEFANGFALAIHUOQUTAMENDESHILI。

 

全民快乐8getInstance()DEFANHUIZHISHIYIGEDUIXIANGDEYINYONG,BINGBUSHIYIGEXINDESHILI,SUOYIBUYAOCUOWUDELIJIECHENGDUOGEDUIXIANG。DANLIMOSHISHIXIANQILAIYEHENRONGYI,ZHIJIEKANdemoBA:

 

Java软件开发设计模式-单例模式

 

SHANGMIANDESHIZUIJIBENDEXIEFA,YEJIAOLANHANXIEFA(XIANCHENGBUANQUAN),XIAMIANZAIGONGBUWUZHONGDANLIMOSHIDEXIEFA:

 

1、懒汉式写法(线程安全)

 

Java软件开发设计模式-单例模式懒汉写法

 

2、饿汉式写法

 

Java软件开发设计模式-单例模式饿汉式写法

 

3、静态内部类

 

Java软件开发设计模式-单例模式静态内部类写法

 

4、枚举

 

Java软件开发设计模式-枚举写法

 

ZHEIZHONGFANGSHISHIEffective JavaZUOZHEJosh Bloch TICHANGDEFANGSHI,TABUJINNENGBIMIANDUOXIANCHENGTONGBUWENTI,ERQIEHAINENGFANGZHIFANXULIEHUAZHONGXINCHUANGJIANXINDEDUIXIANG,KEWEISHIHENJIANQIANGDEBILEIA,BUGUO,GERENRENWEIYOUYU1.5ZHONGCAIJIARUenumTEXING,YONGZHEIZHONGFANGSHIXIEBUMIANRANGRENGANJUESHENGSHU。

 

5、双重校验锁

 

Java软件开发设计模式-单例模式双重校验锁写法

 

总结:全民快乐8我个人比较喜欢静态内部类写法和饿汉式写法,其实这两种写法能够应付绝大多数情况了。其他写法也可以选择,主要还是看业务需求吧。

 

观察者模式

 

DUIXIANGJIANYIDUIDUODEYILAIGUANXI,DANGYIGEDUIXIANGDEZHUANGTAIFASHENGGAIBIANSHI,SUOYOUYILAIYUTADEDUIXIANGDOUDEDAOTONGZHIBINGBEIZIDONGGENGXIN。

 

Java软件开发设计模式-观察者模式

GUANCHAZHEMOSHIUMLTU

 

全民快乐8KANBUDONGTUDERENDUANZHEXIAOBANDENGDAOZHEILILAI,JINIJUGELIZI:JIASHEYOUSANGEREN,XIAOMEI(NV,22),XIAOWANGHEXIAOLI。XIAOMEIHENPIAOLIANG,XIAOWANGHEXIAOLISHILIANGGECHENGXUYUAN,SHIKEGUANZHUZHEXIAOMEIDEYIJUYIDONG。YOUYITIAN,XIAOMEISHUOLEYIJU:“SHEILAIPEIWODAYOUXIA。”ZHEIJUHUABEIXIAOWANGHEXIAOLITINGDAOLE,JIEGUOLEHUAILE,CENGCENGCENG,MEIYIHUIER,XIAOWANGJIUCHONGDAOXIAOMEIJIAMENKOULE,ZAIZHEILI,XIAOMEISHIBEIGUANCHAZHE,XIAOWANGHEXIAOLISHIGUANCHAZHE,BEIGUANCHAZHEFACHUYITIAOXINXI,RANHOUGUANCHAZHEMENJINXINGXIANGYINGDECHULI,KANDAIMA:

 

Java软件开发设计模式-观察者模式

 

全民快乐8ZHEIGEJIEKOUXIANGDANGYUXIAOWANGHEXIAOLIDEDIANHUAHAOMA,XIAOMEIFASONGTONGZHIDESHIHOUJIUHUIBODAgetMessageZHEIGEDIANHUA,BODADIANHUAJIUSHIDIAOYONGJIEKOU,KANBUDONGMEIGUANXI,XIANWANGXIAKAN

 

Java软件开发设计模式-观察者模式

 

全民快乐8DAIMAHENJIANDAN,WOMENZAIKANKANXIAOMEIDEDAIMA:

 

Java软件开发设计模式-观察者模式

 

WOMENXIEYIGECESHILEILAIKANYIXIAJIEGUODUIBUDUI

 

Java软件开发设计模式-观察者模式

 

WANMEI~

 

装饰者模式

 

DUIYIYOUDEYEWULUOJIJINYIBUDEFENGZHUANG,SHIQIZENGJIAEWAIDEGONGNENG,RUJavaZHONGDEIOLIUJIUSHIYONGLEZHUANGSHIZHEMOSHI,YONGHUZAISHIYONGDESHIHOU,KEYIRENYIZUZHUANG,DADAOZIJIXIANGYAODEXIAOGUO。 JUGELIZI,WOXIANGCHISANMINGZHI,SHOUXIANWOXUYAOYIGENDADADEXIANGCHANG,WOXIHUANCHINAIYOU,ZAIXIANGCHANGSHANGMIANJIAYIDIANNAIYOU,ZAIFANGYIDIANSHUCAI,ZUIHOUZAIYONGLIANGPIANMIANBAOJIAYIXIA,HENFENGSHENGDEYIDUNWUFAN,YINGYANGYOUJIANKANG。(ps:BUZHIDAOSHANGHAINALIYOUMAIHAOCHIDESANMINGZHIDE,QIUTUIJIAN~)NEIWOMENYINGGAIZENMELAIXIEDAIMANI? SHOUXIAN,WOMENXUYAOXIEYIGEFoodLEI,RANGQITASUOYOUSHIWUDOULAIJICHENGZHEIGELEI,KANDAIMA:

 

Java软件开发设计模式-装饰者模式

 

全民快乐8DAIMAHENJIANDAN,WOJIUBUJIESHILE,RANHOUWOMENXIEJIGEZILEIJICHENGTA:

 

Java软件开发设计模式-装饰者模式

Java软件开发设计模式-装饰者模式


ZHEIJIGELEIDOUSHICHABUDUODE,GOUZAOFANGFACHUANRUYIGEFoodLEIXINGDECANSHU,RANHOUZAImakeFANGFAZHONGJIARUYIXIEZIJIDELUOJI,RUGUONIHAISHIKANBUDONGWEISHENMEZHEIMEXIE,BUJI,NIKANKANWODETestLEISHIZENMEXIEDE,YIKANNIJIUMINGBAILE

 

Java软件开发设计模式-装饰者模式

 

全民快乐8KANDAOMEIYOU,YICENGYICENGFENGZHUANG,WOMENCONGLIWANGWAIKAN:ZUILIMIANWOnewLEYIGEXIANGCHANG,ZAIXIANGCHANGDEWAIMIANWOBAOGUOLEYICENGNAIYOU,ZAINAIYOUDEWAIMIANWOYOUJIALEYICENGSHUCAI,ZUIWAIMIANWOFANGDESHIMIANBAO,SHIBUSHIHENXINGXIANG,HAHA~ ZHEIGESHEJIMOSHIJIANZHIGENXIANSHISHENGHUOZHONGYIMOYIYANG,KANDONGLEMA? WOMENKANKANYUNXINGJIEGUOBA

 

Java软件开发设计模式-装饰者模式运行结果

YUNXINGJIEGUO

 

YIGESANMINGZHIJIUZUOHAOLE~

 

适配器模式

 

JIANGLIANGZHONGWANQUANBUTONGDESHIWULIANXIDAOYIQI,JIUXIANGXIANSHISHENGHUOZHONGDEBIANYAQI。JIASHEYIGESHOUJICHONGDIANQIXUYAODEDIANYASHI20V,DANSHIZHENGCHANGDEDIANYASHI220V,ZHEISHIHOUJIUXUYAOYIGEBIANYAQI,JIANG220VDEDIANYAZHUANHUANCHENG20VDEDIANYA,ZHEIYANG,BIANYAQIJIUJIANG20VDEDIANYAHESHOUJILIANXIQILAILE。

 

Java软件开发设计模式-适配器模式


Java软件开发设计模式-适配器模式

 

工厂模式

 

1、简单工厂模式全民快乐8:一个抽象的接口,多个抽象接口的实现类,一个工厂类,用来实例化抽象的接口

 

Java软件开发设计模式-工厂模式-简单工厂模式

Java软件开发设计模式-工厂模式-简单工厂模式

 

2、工厂方法模式:有四个角色,抽象工厂模式,具体工厂模式,抽象产品模式,具体产品模式。不再是由一个工厂类去实例化具体的产品,而是由抽象工厂的子类去实例化产品

 

Java软件开发设计模式-工厂模式-工厂方法模式

Java软件开发设计模式-工厂模式-工厂方法模式

 

3、抽象工厂模式全民快乐8:与工厂方法模式不同的是,工厂方法模式中的工厂只生产单一的产品,而抽象工厂模式中的工厂生产多个产品

 

Java软件开发设计模式-工厂模式-抽象工厂模式

 

代理模式(proxy)

 

全民快乐8JIANDANSHUOJISHIZAIBUGAIBIANYUANMADEQINGKUANGXIA,SHIXIANDUIMUBIAODUIXIANGDEGONGNENGKUOZHAN。BIRUYOUGEGESHOUDUIXIANGJIAOSinger,ZHEIGEDUIXIANGYOUYIGECHANGGEFANGFAJIAOsing()。

 

Java软件开发设计模式-代理模式

 

JIARUNIXIWANG,TONGGUONIDEMOUZHONGFANGSHISHENGCHANCHULAIDEGESHOUDUIXIANG,ZAICHANGGEQIANHOUHAIYAOXIANGGUANZHONGWENHAOHEDAXIE,YEJIDUIMUBIAODUIXIANGSingerDEsingFANGFAJINXINGGONGNENGKUOZHAN。

 

Java软件开发设计模式-代理模式

 

全民快乐8DANSHIWANGWANGNIYOUBUNENGZHIJIEDUIYUANDAIMAJINXINGXIUGAI,KENENGSHINIXIWANGYUANLAIDEDUIXIANGHAIBAOCHIYUANLAIDEYANGZI,YOUHUOXUNITIGONGDEZHISHIYIGEKECHABADECHAJIAN,SHENZHINIYOUKENENGDOUBUZHIDAONIYAODUINAGEMUBIAODUIXIANGJINXINGKUOZHAN。ZHEISHIJIUXUYAOYONGDAOjavaDEDAILIMOSHILE。WANGSHANGHAODUOYONGSHENGHUOZHONGDEJINGLIRENDELIZILAIJIESHI“DAILI”,KANSITONGSUYIDONG,DANWOJUEDEBUSHIHECHENGXUYUANQULIJIE。CHENGXUYUANYINGGAICONGDAIMADEBENZHIRUSHOU。

 

XIANGYAOSHIXIANYISHANGDEXUQIUYOUSANZHONGFANGSHI:

 

1、静态代理

 

Java软件开发设计模式-代理模式-静态代理

 

CESHI

 

Java软件开发设计模式-代理模式-静态代理测试

 

总结:其实这里做的事情无非就是,创建一个代理类SingerProxy,继承了ISinger接口并实现了其中的方法。只不过这种实现特意包含了目标对象的方法,正是这种特征使得看起来像是“扩展”了目标对象的方法。假使代理对象中只是简单地对sing方法做了另一种实现而没有包含目标对象的方法,也就不能算作代理模式了。所以这里的包含是关键。

 

缺点:这种实现方式很直观也很简单,但其缺点是代理对象必须提前写出,如果接口层发生了变化,代理对象的代码也要进行维护。如果能在运行时动态地写出代理对象,不但减少了一大批代理类的代码,也少了不断维护的烦恼,不过运行时的效率必定受到影响。这种方式就是接下来的动态代理。

 

2、动态代理(也叫JDK代理)

 

 GENJINGTAIDAILIDEQIANTIYIYANG,YIRANSHIDUISingerDUIXIANGJINXINGKUOZHAN。

 

Java软件开发设计模式-代理模式-动态代理

 

ZHEIHUIZHIJIESHANGCESHI,YOUYUjavaDICENGFENGZHUANGLESHIXIANXIJIE,SUOYIDAIMAFEICHANGJIANDAN,GESHIYEJIBENSHANGGUDING。

 

DIAOYONGProxyLEIDEJINGTAIFANGFAnewProxyInstanceJIKE,GAIFANGFAHUIFANHUIDAILILEIDUIXIANG。

 

Java软件开发设计模式-代理模式-动态代理

 

JIESHOUDESANGECANSHUYICIWEI:

 

● ClassLoader loader:ZHIDINGDANGQIANMUBIAODUIXIANGSHIYONGLEIJIAZAIQI,XIEFAGUDING

● Class

● InvocationHandler h:SHIJIANCHULIJIEKOU,XUCHUANRUYIGESHIXIANLEI,YIBANZHIJIESHIYONGNIMINGNEIBULEI

 

CESHIDAIMA

 

Java软件开发设计模式-代理模式-动态代理测试代码

 

总结全民快乐8:以上代码只有标黄的部分是需要自己写出,其余部分全都是固定代码。由于java封装了newProxyInstance这个方法的实现细节,所以使用起来才能这么方便。

 

缺点全民快乐8:可以看出静态代理和JDK代理有一个共同的缺点,就是目标对象必须实现一个或多个接口,加入没有,则可以使用Cglib代理。

 

3、Cglib代理

 

QIANTITIAOJIAN:

 

全民快乐8● XUYAOYINRUcglibDEjarWENJIAN,YOUYUSpringDEHEXINBAOZHONGYIJINGBAOKUOLECglibGONGNENG,SUOYIYEKEYIZHIJIEYINRUspring-core-3.2.5.jar

● MUBIAOLEIBUNENGWEIfinal

● MUBIAODUIXIANGDEFANGFARUGUOWEIfinal/static,NEIMEJIUBUHUIBEILANJIE,JIBUHUIZHIXINGMUBIAODUIXIANGEWAIDEYEWUFANGFA

 

Java软件开发设计模式-代理模式-Cglib代理


Java软件开发设计模式-代理模式-Cglib代理

 

全民快乐8ZHEILIDEDAIMAYEFEICHANGGUDING,ZHIYOUBIAOHUANGBUFENSHIXUYAOZIJIXIECHU

 

CESHI

 

Java软件开发设计模式-代理模式-Cglib代理测试代码

 

总结全民快乐8:三种代理模式各有优缺点和相应的适用范围,主要看目标对象是否实现了接口。以Spring框架所选择的代理模式举例

 

Java软件开发设计模式-代理模式举例


课程预约

全民快乐8

全民快乐8