日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式 工厂模式 从卖肉夹馍说起

發布時間:2023/12/20 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 工厂模式 从卖肉夹馍说起 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/24460585

今天繼續設計模式之旅,給大家帶來工廠模式,簡單列一下這個模式的家族:

1、靜態工廠模式

2、簡單工廠模式

3、工廠方法模式

4、抽象工廠模式

是不是覺得,我勒個去,這工廠還能列出這么多分類,哈哈,下面開始各個擊破。

1、靜態工廠模式

這個最常見了,項目中的輔助類,TextUtil.isEmpty等,類+靜態方法。下面開始詳細介紹:略。

2、簡單工廠模式

下面開始談談賣肉夾饃,最近程序員賣肉夾饃很火,啥時候大牛們都去賣了,我等就崛起了,哈哈。

首先你得有個店:RoujiaMoStore

[java]?view plaincopy
  • package?com.zhy.pattern.factory.a;??
  • ??
  • public?class?RoujiaMoStore??
  • {??
  • ??
  • ????/**?
  • ?????*?根據傳入類型賣不同的肉夾饃?
  • ?????*??
  • ?????*?@param?type?
  • ?????*?@return?
  • ?????*/??
  • ????public?RouJiaMo?sellRouJiaMo(String?type)??
  • ????{??
  • ????????RouJiaMo?rouJiaMo?=?null;??
  • ??????????
  • ????????if?(type.equals("Suan"))??
  • ????????{??
  • ????????????rouJiaMo?=?new?SuanRouJiaMo();??
  • ??
  • ????????}?else?if?(type.equals("Tian"))??
  • ????????{??
  • ????????????rouJiaMo?=?new?TianRouJiaMo();??
  • ????????}?else?if?(type.equals("La"))??
  • ????????{??
  • ????????????rouJiaMo?=?new?LaRouJiaMo();??
  • ????????}??
  • ??????????
  • ????????rouJiaMo.prepare();??
  • ????????rouJiaMo.fire();??
  • ????????rouJiaMo.pack();??
  • ????????return?rouJiaMo;??
  • ????}??
  • ??
  • }??

  • 然后你得有各種風味的饃饃:

    [java]?view plaincopy
  • package?com.zhy.pattern.factory.a;??
  • ??
  • public?abstract?class?RouJiaMo??
  • {??
  • ????protected?String?name;??
  • ??
  • ????/**?
  • ?????*?準備工作?
  • ?????*/??
  • ????public?void?prepare()??
  • ????{??
  • ????????System.out.println("揉面-剁肉-完成準備工作");??
  • ????}??
  • ??
  • ????/**?
  • ?????*?使用你們的專用袋-包裝?
  • ?????*/??
  • ????public?void?pack()??
  • ????{??
  • ????????System.out.println("肉夾饃-專用袋-包裝");??
  • ????}??
  • ????/**?
  • ?????*?秘制設備-烘烤2分鐘?
  • ?????*/??
  • ????public?void?fire()??
  • ????{??
  • ????????System.out.println("肉夾饃-專用設備-烘烤");??
  • ????}??
  • }??

  • [java]?view plaincopy
  • package?com.zhy.pattern.factory.a;??
  • ??
  • import?com.zhy.pattern.factory.a.RouJiaMo;??
  • ??
  • /**?
  • ?*?辣味肉夾饃?
  • ?*??
  • ?*?@author?zhy?
  • ?*??
  • ?*/??
  • public?class?LaRouJiaMo?extends?RouJiaMo??
  • {??
  • ????public?LaRouJiaMo()??
  • ????{??
  • ????????this.name?=?"辣味肉夾饃";??
  • ????}??
  • }??

  • [java]?view plaincopy
  • package?com.zhy.pattern.factory.a;??
  • ??
  • ??
  • ??
  • /**?
  • ?*?酸味肉夾饃?
  • ?*??
  • ?*?@author?zhy?
  • ?*??
  • ?*/??
  • public?class?SuanRouJiaMo?extends?RouJiaMo??
  • {??
  • ????public?SuanRouJiaMo()??
  • ????{??
  • ????????this.name?=?"酸味肉夾饃";??
  • ????}??
  • }??

  • [java]?view plaincopy
  • package?com.zhy.pattern.factory.a;??
  • ??
  • ??
  • ??
  • /**?
  • ?*?酸味肉夾饃?
  • ?*??
  • ?*?@author?zhy?
  • ?*??
  • ?*/??
  • public?class?SuanRouJiaMo?extends?RouJiaMo??
  • {??
  • ????public?SuanRouJiaMo()??
  • ????{??
  • ????????this.name?=?"酸味肉夾饃";??
  • ????}??
  • }??

  • 現在這樣的設計,雖然可以支持你賣肉夾饃了,但是有點問題,生產饃的種類和你的RoujiaMoStore耦合度太高了,如果增加幾種風味,刪除幾種風味,你得一直修改sellRouJiaMo中的方法,所以我們需要做一定的修改,此時簡單工廠模式就能派上用場了。

    我們開始寫個簡單工廠,把產生饃的過程拿出來:

    [java]?view plaincopy
  • package?com.zhy.pattern.factory.a;??
  • ??
  • public?class?SimpleRouJiaMoFactroy??
  • {??
  • ????public?RouJiaMo?createRouJiaMo(String?type)??
  • ????{??
  • ????????RouJiaMo?rouJiaMo?=?null;??
  • ????????if?(type.equals("Suan"))??
  • ????????{??
  • ????????????rouJiaMo?=?new?SuanRouJiaMo();??
  • ??
  • ????????}?else?if?(type.equals("Tian"))??
  • ????????{??
  • ????????????rouJiaMo?=?new?TianRouJiaMo();??
  • ????????}?else?if?(type.equals("La"))??
  • ????????{??
  • ????????????rouJiaMo?=?new?LaRouJiaMo();??
  • ????????}??
  • ????????return?rouJiaMo;??
  • ????}??
  • ??
  • }??

  • 然后以組合的方式,讓Store來使用:

    [java]?view plaincopy
  • package?com.zhy.pattern.factory.a;??
  • ??
  • public?class?RoujiaMoStore??
  • {??
  • ????private?SimpleRouJiaMoFactroy?factroy;??
  • ??
  • ????public?RoujiaMoStore(SimpleRouJiaMoFactroy?factroy)??
  • ????{??
  • ????????this.factroy?=?factroy;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?根據傳入類型賣不同的肉夾饃?
  • ?????*??
  • ?????*?@param?type?
  • ?????*?@return?
  • ?????*/??
  • ????public?RouJiaMo?sellRouJiaMo(String?type)??
  • ????{??
  • ????????RouJiaMo?rouJiaMo?=?factroy.createRouJiaMo(type);??
  • ????????rouJiaMo.prepare();??
  • ????????rouJiaMo.fire();??
  • ????????rouJiaMo.pack();??
  • ????????return?rouJiaMo;??
  • ????}??
  • ??
  • }??

  • 好了,現在你隨便添加什么種類的饃,刪除什么種類的饃就和Store無關了,就是么~人家只負責賣饃么~ 這就是簡單工廠模式,當然了,大家也都比較熟悉。

    3、工廠方法模式

    定義:定義一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法模式把類實例化的過程推遲到子類。

    好了,看完定義,下面我們用例子來展示。繼續肉夾饃,由于使用了簡單工廠模式,肉夾饃生意那個好啊,所以下載決定去西安開個分店,去北京開個分店。既然有分店了,那總店就是抽象的了:

    [java]?view plaincopy
  • package?com.zhy.pattern.factory.b;??
  • ??
  • public?abstract?class?RoujiaMoStore??
  • {??
  • ??
  • ????public?abstract?RouJiaMo?createRouJiaMo(String?type);??
  • ??
  • ????/**?
  • ?????*?根據傳入類型賣不同的肉夾饃?
  • ?????*??
  • ?????*?@param?type?
  • ?????*?@return?
  • ?????*/??
  • ????public?RouJiaMo?sellRouJiaMo(String?type)??
  • ????{??
  • ????????RouJiaMo?rouJiaMo?=?createRouJiaMo(type);??
  • ????????rouJiaMo.prepare();??
  • ????????rouJiaMo.fire();??
  • ????????rouJiaMo.pack();??
  • ????????return?rouJiaMo;??
  • ????}??
  • ??
  • }??

  • 然后在開兩個分店,這里拿一個代碼做演示,其他都一樣:

    [java]?view plaincopy
  • package?com.zhy.pattern.factory.b;??
  • ??
  • ??
  • ??
  • /**?
  • ?*?西安肉夾饃店?
  • ?*??
  • ?*?@author?zhy?
  • ?*??
  • ?*/??
  • public?class?XianRouJiaMoStore?extends?RoujiaMoStore??
  • {??
  • ??
  • ????@Override??
  • ????public?RouJiaMo?createRouJiaMo(String?type)??
  • ????{??
  • ????????RouJiaMo?rouJiaMo?=?null;??
  • ????????if?(type.equals("Suan"))??
  • ????????{??
  • ????????????rouJiaMo?=?new?XianSuanRouJiaMo();??
  • ??
  • ????????}?else?if?(type.equals("Tian"))??
  • ????????{??
  • ????????????rouJiaMo?=?new?XianTianRouJiaMo();??
  • ????????}?else?if?(type.equals("La"))??
  • ????????{??
  • ????????????rouJiaMo?=?new?XianLaRouJiaMo();??
  • ????????}??
  • ????????return?rouJiaMo;??
  • ??
  • ????}??
  • ??
  • }??

  • 然后就是各個西安口味的肉夾饃了,這代碼就不貼了。可以看出我們把制作肉夾饃的過程以抽象方法的形式讓子類去決定了,對照定義:

    1、定義了創建對象的一個接口:public abstract RouJiaMo createRouJiaMo(String type);

    2、由子類決定實例化的類,可以看到我們的饃是子類生成的。

    可能有人會說,我用簡單工廠模式也行啊,但是如果10來個城市*5種風味/城市,那么豈不是簡單工廠里面需要50多個if,再說人家西安肉夾饃分店就不能有點自己的秘訣,當然由它自己定最好。

    好了,方法工廠模式介紹完畢。

    4、抽象工廠模式

    定義:提供一個接口,用于創建相關的或依賴對象的家族,而不需要明確指定具體類。

    這定義有點繞口,算了,還是拿例子來說。繼續賣肉夾饃,咱們生意這么好,難免有些分店開始動歪腦子,開始使用劣質肉等,砸我們的品牌。所以我們要拿錢在每個城市建立自己的原料場,保證高質量原料的供應。

    于是我們新建一個提供原料的接口:

    [java]?view plaincopy
  • package?com.zhy.pattern.factory.b;??
  • ??
  • /**?
  • ?*?提供肉夾饃的原料?
  • ?*?@author?zhy?
  • ?*?
  • ?*/??
  • public?interface?RouJiaMoYLFactroy??
  • {??
  • ????/**?
  • ?????*?生產肉?
  • ?????*?@return?
  • ?????*/??
  • ????public?Meat?createMeat();??
  • ??????
  • ????/**?
  • ?????*?生產調料神馬的?
  • ?????*?@return?
  • ?????*/??
  • ????public?YuanLiao?createYuanliao();??
  • ??????
  • }??

  • [java]?view plaincopy
  • package?com.zhy.pattern.factory.b;??
  • ??
  • /**?
  • ?*?根據西安當地特色,提供這兩種材料?
  • ?*?@author?zhy?
  • ?*?
  • ?*/??
  • public?class?XianRouJiaMoYLFactroy?implements?RouJiaMoYLFactroy??
  • {??
  • ??
  • ????@Override??
  • ????public?Meat?createMeat()??
  • ????{??
  • ????????return?new?FreshMest();??
  • ????}??
  • ??
  • ????@Override??
  • ????public?YuanLiao?createYuanliao()??
  • ????{??
  • ????????return?new?XianTeSeYuanliao();??
  • ????}??
  • ??
  • }??

  • 有了原理工廠,那我們稍微修改下RouJiaMo的prepare方法:

    [java]?view plaincopy
  • package?com.zhy.pattern.factory.b;??
  • ??
  • public?abstract?class?RouJiaMo??
  • {??
  • ????protected?String?name;??
  • ??
  • ????/**?
  • ?????*?準備工作?
  • ?????*/??
  • ????public?final?void?prepare(RouJiaMoYLFactroy?ylFactroy)??
  • ????{??
  • ????????Meat?meat?=?ylFactroy.createMeat();??
  • ????????YuanLiao?yuanliao?=?ylFactroy.createYuanliao();??
  • ????????System.out.println("使用官方的原料"?+?meat?+?"?,?"?+?yuanliao?+?"作為原材料制作肉夾饃?");??
  • ????}??
  • ??
  • ????/**?
  • ?????*?使用你們的專用袋-包裝?
  • ?????*/??
  • ????public?final?void?pack()??
  • ????{??
  • ????????System.out.println("肉夾饃-專用袋-包裝");??
  • ????}??
  • ??
  • ????/**?
  • ?????*?秘制設備-烘烤2分鐘?
  • ?????*/??
  • ????public?final?void?fire()??
  • ????{??
  • ????????System.out.println("肉夾饃-專用設備-烘烤");??
  • ????}??
  • }??

  • 好了,現在必須用我們官方原料做為原材料了。

    現在對比定義:

    1、提供一個接口:public interface RouJiaMoYLFactroy

    2、用于創建相關的或依賴對象的家族?public Meat createMeat();public YuanLiao createYuanliao();我們接口用于創建一系列的原材料。

    好了,最后測試下,我要在西安饃店,買個酸味的嘗嘗:

    [java]?view plaincopy
  • package?com.zhy.pattern.factory.b;??
  • ??
  • ??
  • public?class?Test??
  • {??
  • ????public?static?void?main(String[]?args)??
  • ????{??
  • ??????????
  • ????????RoujiaMoStore?roujiaMoStore?=?new?XianRouJiaMoStore();??
  • ????????RouJiaMo?suanRoujiaMo?=?roujiaMoStore.sellRouJiaMo("Suan");??
  • ????????System.out.println(suanRoujiaMo.name);??
  • ????}??
  • }??

  • [java]?view plaincopy
  • 使用官方的原料com.zhy.pattern.factory.b.FreshMest@e53108?,?com.zhy.pattern.factory.b.XianTeSeYuanliao@f62373作為原材料制作肉夾饃???
  • 肉夾饃-專用設備-烘烤??
  • 肉夾饃-專用袋-包裝??
  • 酸味肉夾饃??

  • 哈哈~肉夾饃店的已經建立起來了,兄弟們賣饃去把~記得留個言,給個贊~

    總結

    以上是生活随笔為你收集整理的设计模式 工厂模式 从卖肉夹馍说起的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。