设计模式 工厂模式 从卖肉夹馍说起
轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/lmj623565791/article/details/24460585
今天繼續(xù)設(shè)計(jì)模式之旅,給大家?guī)?lái)工廠模式,簡(jiǎn)單列一下這個(gè)模式的家族:
1、靜態(tài)工廠模式
2、簡(jiǎn)單工廠模式
3、工廠方法模式
4、抽象工廠模式
是不是覺(jué)得,我勒個(gè)去,這工廠還能列出這么多分類,哈哈,下面開始各個(gè)擊破。
1、靜態(tài)工廠模式
這個(gè)最常見了,項(xiàng)目中的輔助類,TextUtil.isEmpty等,類+靜態(tài)方法。下面開始詳細(xì)介紹:略。
2、簡(jiǎn)單工廠模式
下面開始談?wù)勝u肉夾饃,最近程序員賣肉夾饃很火,啥時(shí)候大牛們都去賣了,我等就崛起了,哈哈。
首先你得有個(gè)店:RoujiaMoStore
[java]?view plaincopy
然后你得有各種風(fēng)味的饃饃:
[java]?view plaincopy
[java]?view plaincopy
[java]?view plaincopy
[java]?view plaincopy
現(xiàn)在這樣的設(shè)計(jì),雖然可以支持你賣肉夾饃了,但是有點(diǎn)問(wèn)題,生產(chǎn)饃的種類和你的RoujiaMoStore耦合度太高了,如果增加幾種風(fēng)味,刪除幾種風(fēng)味,你得一直修改sellRouJiaMo中的方法,所以我們需要做一定的修改,此時(shí)簡(jiǎn)單工廠模式就能派上用場(chǎng)了。
我們開始寫個(gè)簡(jiǎn)單工廠,把產(chǎn)生饃的過(guò)程拿出來(lái):
[java]?view plaincopy
然后以組合的方式,讓Store來(lái)使用:
[java]?view plaincopy
好了,現(xiàn)在你隨便添加什么種類的饃,刪除什么種類的饃就和Store無(wú)關(guān)了,就是么~人家只負(fù)責(zé)賣饃么~ 這就是簡(jiǎn)單工廠模式,當(dāng)然了,大家也都比較熟悉。
3、工廠方法模式
定義:定義一個(gè)創(chuàng)建對(duì)象的接口,但由子類決定要實(shí)例化的類是哪一個(gè)。工廠方法模式把類實(shí)例化的過(guò)程推遲到子類。
好了,看完定義,下面我們用例子來(lái)展示。繼續(xù)肉夾饃,由于使用了簡(jiǎn)單工廠模式,肉夾饃生意那個(gè)好啊,所以下載決定去西安開個(gè)分店,去北京開個(gè)分店。既然有分店了,那總店就是抽象的了:
[java]?view plaincopy
然后在開兩個(gè)分店,這里拿一個(gè)代碼做演示,其他都一樣:
[java]?view plaincopy
然后就是各個(gè)西安口味的肉夾饃了,這代碼就不貼了。可以看出我們把制作肉夾饃的過(guò)程以抽象方法的形式讓子類去決定了,對(duì)照定義:
1、定義了創(chuàng)建對(duì)象的一個(gè)接口:public abstract RouJiaMo createRouJiaMo(String type);
2、由子類決定實(shí)例化的類,可以看到我們的饃是子類生成的。
可能有人會(huì)說(shuō),我用簡(jiǎn)單工廠模式也行啊,但是如果10來(lái)個(gè)城市*5種風(fēng)味/城市,那么豈不是簡(jiǎn)單工廠里面需要50多個(gè)if,再說(shuō)人家西安肉夾饃分店就不能有點(diǎn)自己的秘訣,當(dāng)然由它自己定最好。
好了,方法工廠模式介紹完畢。
4、抽象工廠模式
定義:提供一個(gè)接口,用于創(chuàng)建相關(guān)的或依賴對(duì)象的家族,而不需要明確指定具體類。
這定義有點(diǎn)繞口,算了,還是拿例子來(lái)說(shuō)。繼續(xù)賣肉夾饃,咱們生意這么好,難免有些分店開始動(dòng)歪腦子,開始使用劣質(zhì)肉等,砸我們的品牌。所以我們要拿錢在每個(gè)城市建立自己的原料場(chǎng),保證高質(zhì)量原料的供應(yīng)。
于是我們新建一個(gè)提供原料的接口:
[java]?view plaincopy
[java]?view plaincopy
有了原理工廠,那我們稍微修改下RouJiaMo的prepare方法:
[java]?view plaincopy
好了,現(xiàn)在必須用我們官方原料做為原材料了。
現(xiàn)在對(duì)比定義:
1、提供一個(gè)接口:public interface RouJiaMoYLFactroy
2、用于創(chuàng)建相關(guān)的或依賴對(duì)象的家族?public Meat createMeat();public YuanLiao createYuanliao();我們接口用于創(chuàng)建一系列的原材料。
好了,最后測(cè)試下,我要在西安饃店,買個(gè)酸味的嘗嘗:
[java]?view plaincopy
[java]?view plaincopy
哈哈~肉夾饃店的已經(jīng)建立起來(lái)了,兄弟們賣饃去把~記得留個(gè)言,給個(gè)贊~
總結(jié)
以上是生活随笔為你收集整理的设计模式 工厂模式 从卖肉夹馍说起的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 瀚高数据库适配定时框架Quartz
- 下一篇: Blockathon2018(上海)顺利