經典設計模式(三):抽象工廠模式
抽象工廠模式
本來不想寫這篇文章的,應該是不想寫工廠模式,因為基本大家都會,不過今天看到一個老鐵的部落格,https://www.yuxuan66.com/16 關於抽象模式的實現,寫得不錯,看了幾遍之後,有了點自己的想法,隨便再熟悉一下工廠模式,於是就有了這篇文章,主要是抽象工廠,引用下老鐵的例子:咖啡工廠做大做強,引入了新的飲品種類:茶、碳酸飲料。中國工廠僅能製作咖啡和茶,美國工廠僅能製作咖啡和碳酸飲料。
使用
我這裡建立一個抽象工廠,中國工廠和美國工廠繼承它。再建立一個飲料介面,實現各種飲料種類。再建立一個提供者,根據具工廠和種類提供對應的產品
建立一個抽象工廠
/** * @program:hope * @author:aodeng * @blog:低調小熊貓(https://aodeng.cc) * @微信公眾號:低調小熊貓 * @create:2018-11-22 14:43 * 抽象工廠 **/ public abstract class AbstractDrinksFactory { /*** * * @param whatYouLike 你喜歡的飲料型別:coffer,tea,sodas... * @return */ public abstract Drink createDrink(String whatYouLike); }
中國工廠和美國工廠繼承它
public class ChinaAbstractDrinksFactory extends AbstractDrinksFactory { @Override public Drink createDrink(String whatYouLike) { Drink drink=null; if ("coffer".equals(whatYouLike)){ drink=new CofferDrink(); }else if ("tea".equals(whatYouLike)){ drink=new TeaDrink(); } return drink; } } // public class USAAbstractDrinksFactory extends AbstractDrinksFactory { @Override public Drink createDrink(String whatYouLike) { Drink drink=null; if ("coffer".equals(whatYouLike)){ drink=new CofferDrink(); }else if ("sodas".equals(whatYouLike)){ drink=new SodasDrink(); } return drink; } }
再建立一個飲料介面
//飲料介面
public interface Drink {
String getName();
}
實現各種飲料種類
//咖啡飲料 public class CofferDrink implements Drink { @Override public String getName() { return "coffer"; } } //碳酸飲料 public class SodasDrink implements Drink { @Override public String getName() { return "sodas"; } } // 茶飲料 public class TeaDrink implements Drink { @Override public String getName() { return "tea"; } }
再建立一個提供者,更具工廠和種類提供對應的產品
* 工廠提供者
**/
public class DrinkStore {
AbstractDrinksFactory abstractDrinksFactory;
/***
* 動態的選擇工廠
* @param abstractDrinksFactory
*/
public DrinkStore(AbstractDrinksFactory abstractDrinksFactory){
this.abstractDrinksFactory=abstractDrinksFactory;
}
/***
* 根據產品型別生產
* @param whatYouLike
* @return
*/
public Drink createDrink(String whatYouLike){
return abstractDrinksFactory.createDrink(whatYouLike);
}
}
Main方法測試
/**
* @program:hope
* @author:aodeng
* @blog:低調小熊貓(https://aodeng.cc)
* @微信公眾號:低調小熊貓
* @create:2018-11-22 15:07
**/
public class Main {
public static void main(String[] args) {
//使用工廠提供類選擇工廠
DrinkStore store=new DrinkStore(new ChinaAbstractDrinksFactory());
//根據產品生產飲料
Drink drink=store.createDrink("tea");
//得到具體工廠的具體飲料
System.out.println(drink.getName());//輸出tea
}
}
以上就是整個抽象工廠了,不是很細(主要是懶得介紹了),自己感悟吧:),都是這樣學習的:)
簡單說一下:
簡單工廠和抽象工廠有些區別,除了結構上的區別,主要區別在於使用場景不同。
簡單工廠用於建立單一產品,將所有子類的建立過程集中在一個工廠中,如要修改,只需修改一個工廠即可。簡單工廠經常和單例模式一起使用,例如用簡單工廠建立快取物件(檔案快取),某天需要改用redis快取,修改工廠即可。
抽象工廠常用於建立一整個產品族,而不是單一產品。通過選擇不同的工廠來達到目的,其優勢在於可以通過替換工廠而快速替換整個產品族。例如上面的例子美國工廠生產美國drink,中國工廠生產中國drink。
優點
客戶端與具體要建立的產品解耦,擴充套件性和靈活性高
缺點
增加要建立的物件時,需要增加的程式碼較多,會使系統變得較為複雜
原始碼
https://github.com/java-aodeng/hope
我的部落格:https://aodeng.cc 我的公眾號:低調小熊貓 我的QQ群:756796932
- 本文作者:低調小熊貓
- 本文連結:https://aodeng.cc/archives/jing-dian-she
- 版權宣告:本部落格所有文章除特別宣告外,均採用知識共享署名 4.0 國際許可協議。轉載請註明出處!