Gof 抽象工廠模式

2021-10-14 06:07:35 字數 2033 閱讀 5899

繼續打卡設計模式

今天聊一下抽象工廠模式

依然回到我們訂購披薩的需求 ,我們現在依然存在北京的(希臘、乳酪、胡椒三種口味)以及倫敦(希臘、乳酪、胡椒三種口味)。

學習抽象工廠一定先了解一下簡單工廠模式

那麼現在我們看看二者的區別在**

首先我們需要有乙個pizza的基類

/**

* @author: 德鑫

* description:

* @date: 2021/01/05

*/public abstract class pizza

public void cut()

//打包

public void box()

public void setname(string name)

}

剩餘的讓不同地區不同口味的具體pizza來繼承這個pizza的基類

public class bjcheesepizza extends pizza 

}

public class bjpepperpizza extends pizza 

}

public class ldcheesepizza extends pizza 

}

public class ldpepperpizza extends pizza 

}

好了,至此我們現在如果讓使用者便捷的下單,並且以後我們在增加擴充套件披薩的口味時候能夠不改變原有的**

關鍵點:

我們現在定義乙個工廠介面便於其它工廠子類進行擴充套件

public inte***ce absfactory
那麼這裡提供了來讓工廠生產披薩的行為。我們讓北京工廠和倫敦工廠來實現這個介面

/**

* @author: 德鑫

* description: 生成北京口味的披薩

* @date: 2021/01/05

*///這是工廠子類

public class bjfactory implements absfactory else if (ordertype.equals("pepper"))

return pizza;

}}

/**

* @author: 德鑫

* description: 生成倫敦口味的披薩

* @date: 2021/01/05

*/public class ldfactory implements absfactory else if (ordertype.equals("pepper"))

return pizza;

}}

那我們現在如何來使用這些工廠來生成對應的pizza呢

很容易聯想到簡單工廠的方式我們,這裡依然可以採用相類似的方式。

public class orderpizza 

private void setfactory(absfactory factory) else

} while (true);

}// 寫乙個方法,可以獲取客戶希望訂購的披薩種類

private string gettype() catch (ioexception e)

}}

那麼這裡就是我們通過注入應該抽象工廠。然後通過客戶端傳輸過來的抽象工廠不同來建立不同的pizza類

通過改造器來呼叫使得測試起來更加的方便,如果這裡直接通過訂單類物件直接呼叫setfactory方法也是可以的。

最後寫乙個客戶端測試

public class pizzastore 

}

這樣根據使用者自己輸入不同口味得到的就是對應工廠的口味披薩了

實際上抽象工廠是簡單工廠和工廠方法的一種組合。寫法上很類似簡單工廠模式。但是實際的實現思想上參考了工廠方法模式

GOF之抽象工廠模式

動機 motivation 在軟體系統中,經常面臨著 一系列相互依賴的物件 的建立工作 同時,由於需求的變化,往往存在更多系列的物件的建立工作。如何應對這種變化?如何繞過常規的物件建立方法 new 提供一種 封裝機制 來避免客戶程式和這種 多系列具體物件建立工作 的緊耦合?意圖 intene 提供乙...

設計模式GOF23 抽象工廠模式

抽象工廠模式 abstract factory 是建立者模式的一種,是一種負責建立物件的模式。抽象工廠算是工廠模式的一種,因為邏輯和實現相對複雜一些,所以在設計模式中不少說明都是分開說明的。抽象工廠也是為了實現物件建立和物件使用的分離。工廠模式雖然已經實現了這一需求,但是還是不夠徹底。比如 如果建立...

GOF的23種設計模式(3) 抽象工廠模式

定義 優點 缺點 手機產品介面 public inte ce iphoneproduct 路由器產品介面 public inte ce irouterproduct 蘋果手機 public class implements iphoneproduct override public void shu...