2 工廠模式 從賣肉夾饃說起

2021-10-09 17:00:52 字數 4215 閱讀 7223

簡單列一下這個模式的家族:

1、靜態工廠模式

2、簡單工廠模式

3、工廠方法模式

4、抽象工廠模式

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

1、靜態工廠模式

這個最常見了,專案中的輔助類,textutil.isempty等,類+靜態方法。下面開始詳細介紹:略。

2、簡單工廠模式

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

首先你得有個店:roujiamostore

package com.zhy.pattern.factory.a;

public class roujiamostore

else if (type.equals("tian"))

else if (type.equals("la"))

roujiamo.prepare();

roujiamo.fire();

roujiamo.pack();

return roujiamo; }

}

然後你得有各種風味的饃饃:

package com.zhy.pattern.factory.a;

public abstract class roujiamo

/*** 使用你們的專用袋-包裝

*/public void pack()

/*** 秘製裝置-烘烤2分鐘

*/public void fire()

}

package com.zhy.pattern.factory.a;

import com.zhy.pattern.factory.a.roujiamo;

/*** 辣味肉夾饃

* * @author zhy

* */

public class laroujiamo extends roujiamo

}

package com.zhy.pattern.factory.a;

/** * 酸味肉夾饃

* * @author zhy

* */

public class suanroujiamo extends roujiamo

}

package com.zhy.pattern.factory.a;  

/*** 酸味肉夾饃

* * @author zhy

* */

public class suanroujiamo extends roujiamo

}

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

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

package com.zhy.pattern.factory.a;

public class ******roujiamofactroy

else if (type.equals("tian"))

else if (type.equals("la"))

return roujiamo; }

}

然後以組合的方式,讓store來使用:

package com.zhy.pattern.factory.a;

public class roujiamostore

/*** 根據傳入型別賣不同的肉夾饃

* * @param type

* @return

*/public roujiamo sellroujiamo(string type)

}

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

3、工廠方法模式

定義:定義乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法模式把類例項化的過程推遲到子類。

package com.zhy.pattern.factory.b;

public abstract class roujiamostore

}

然後在開兩個分店,這裡拿乙個**做演示,其他都一樣:

package com.zhy.pattern.factory.b;

/** * 西安肉夾饃店

* * @author zhy

* */

public class xianroujiamostore extends roujiamostore

else if (type.equals("tian"))

else if (type.equals("la"))

return roujiamo; }

}

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

1、定義了建立物件的乙個介面:public abstract roujiamo createroujiamo(string type);

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

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

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

4、抽象工廠模式

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

於是我們新建乙個提供原料的介面:

package com.zhy.pattern.factory.b;

/*** 提供肉夾饃的原料

* @author zhy

* */

public inte***ce roujiamoylfactroy

package com.zhy.pattern.factory.b;

/*** 根據西安當地特色,提供這兩種材料

* @author zhy

* */

public class xianroujiamoylfactroy implements roujiamoylfactroy

@override

public yuanliao createyuanliao()

}

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

package com.zhy.pattern.factory.b;

public abstract class roujiamo

/*** 使用你們的專用袋-包裝

*/public final void pack()

/*** 秘製裝置-烘烤2分鐘

*/public final void fire()

}

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

現在對比定義:

1、提供乙個介面:public inte***ce roujiamoylfactroy

2、用於建立相關的或依賴物件的家族 public meat createmeat();public yuanliao createyuanliao();我們介面用於建立一系列的原材料。

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

package com.zhy.pattern.factory.b;  

public class test

}

使用官方的原料com.zhy.pattern.factory.b.freshmest@e53108 , com.zhy.pattern.factory.b.xianteseyuanliao@f62373作為原材料製作肉夾饃 

肉夾饃-專用裝置-烘烤

肉夾饃-專用袋-包裝

酸味肉夾饃

從 物質決定意識 說起 2

7 實踐是檢驗理論的最好方法,把理論應用於解決實際問題,就產生了解決問題的方案。方案和理論不一樣,解決乙個實際問題可能有很多方案,但能被實際採用的只能是乙個或兩個。這就產生了乙個最好的方案是什麼,它又從何而來的問題。首先,乙個好的方案必須是邏輯上沒有漏洞的,方案本身不能有自相矛盾的地方。其次,好的方...

從工廠模式到抽象工廠模式

之前我們說過簡單工廠模式,以及工廠模式,這次我們接下說抽象工廠模式,首先我們先看一下工廠模式及抽象工廠模式的定義。工廠模式 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。工廠方法使乙個類的例項化延遲到其子類 抽象工廠模式 為建立一組相關或相互依賴的物件提供乙個介面,並且無需指定他們的具體類。...

「工廠模式」 2

3.4 工廠方法 有了簡單工廠模式後,已經給我們帶來了一些好處,但是還存在一些問題,如果我們又多了乙個影像家電產品mp4之後,我們可以使mp4類從videowiring派生,但是卻要修改create類的 使它能夠生產出mp4這個產品來。不好的地方就在於,我們每次多乙個產品的時候都需要修改create...