亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

設計模式:工廠與工廠方法與抽象工廠

設計模式:工廠與工廠方法與抽象工廠

白板的微信 2019-08-06 13:22:04
設計模式:工廠與工廠方法與抽象工廠我正在從網站上閱讀設計模式在那里我讀到了有關工廠,工廠方法和抽象工廠的信息,但它們很混亂,我對定義并不清楚。根據定義Factory - 創建對象而不將實例化邏輯暴露給客戶端,并通過公共接口引用新創建的對象。是Factory Method的簡化版本工廠方法 - 定義用于創建對象的接口,但讓子類決定實例化哪個類,并通過公共接口引用新創建的對象。抽象工廠 - 提供用于創建相關對象族的界面,而無需明確指定其類。我還查看了關于抽象工廠與工廠方法的其他stackoverflow線程,但是那里繪制的UML圖使我的理解更加糟糕。有誰能告訴我這三種模式如何相互不同?什么時候用哪個?如果可能的話,任何與這些模式相關的java示例?
查看完整描述

3 回答

?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

所有三種工廠類型都做同樣的事情:它們是“智能構造函數”。

假設您希望能夠創建兩種水果:Apple和Orange。

工廠是“固定的”,因為你只有一個沒有子類化的實現。在這種情況下,您將擁有這樣的類:

class FruitFactory {

  public Apple makeApple() {
    // Code for creating an Apple here.
  }

  public Orange makeOrange() {
    // Code for creating an orange here.
  }}

使用案例:構造Apple或Orange有點太復雜,無法在構造函數中處理。

工廠方法

工廠方法通常用于在類中進行一些通用處理,但想要改變實際使用的水果類型。所以:

abstract class FruitPicker {

  protected abstract Fruit makeFruit();

  public void pickFruit() {
    private final Fruit f = makeFruit(); // The fruit we will work on..
    <bla bla bla>
  }}

...然后,您可以FruitPicker.pickFruit()通過在子類中實現工廠方法來重用通用功能:

class OrangePicker extends FruitPicker {

  @Override
  protected Fruit makeFruit() {
    return new Orange();
  }}

抽象工廠

抽象工廠通常用于依賴注入/策略之類的東西,當你想要能夠創建一整套需要“同類”的對象時,并且有一些共同的基類。這是一個與水果有關的模糊例子。這里的用例是我們要確保我們不會在Apple上意外使用OrangePicker。只要我們從同一家工廠獲得我們的水果和采摘器,他們就會匹配。

interface PlantFactory {

  Plant makePlant();

  Picker makePicker(); }public class AppleFactory implements PlantFactory {
  Plant makePlant() {
    return new Apple();
  }

  Picker makePicker() {
    return new ApplePicker();
  }}public class OrangeFactory implements PlantFactory {
  Plant makePlant() {
    return new Orange();
  }

  Picker makePicker() {
    return new OrangePicker();
  }}


查看完整回答
反對 回復 2019-08-06
?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

  1. 這三種模式如何相互不同?

Factory:創建對象而不將實例化邏輯暴露給客戶端。

工廠方法:定義用于創建對象的接口,但讓子類決定實例化哪個類。Factory方法允許類將實例化延遲到子類

抽象工廠:提供用于創建相關或從屬對象族的接口,而無需指定其具體類。

AbstractFactory模式使用組合將創建對象的責任委托給另一個類,而Factory方法設計模式使用繼承并依賴派生類或子類來創建對象

  1. 什么時候用哪個?

工廠:客戶只需要一個類,而不關心它正在實現哪個具體實現。

工廠方法:客戶端不知道在運行時需要創建哪些具體類,但只想獲得一個可以完成工作的類。

AbstactFactory:?當您的系統必須創建多個系列的產品或您想要提供產品庫而不暴露實現細節時。

抽象工廠類通常使用Factory Method實現。工廠方法通常在模板方法中調用。

  1. 如果可能的話,任何與這些模式相關的java示例?

工廠和工廠方法

意圖:

定義用于創建對象的接口,但讓子類決定實例化哪個類。Factory Method允許類將實例化延遲到子類。

UML圖:

https://img3.sycdn.imooc.com/5d490eac0001555704690185.jpg

Product:它定義Factory方法創建的對象的接口。

ConcreteProduct:實現產品界面

創建者:聲明工廠方法

ConcreateCreator:?實現Factory方法以返回ConcreteProduct的實例

問題陳述:使用工廠方法創建游戲工廠,工廠方法定義游戲界面。

代碼段:

工廠模式。何時使用工廠方法?

與其他創作模式比較:

  1. 設計從使用工廠方法(不太復雜,可定制,子類增加)開始,并逐漸向Abstract Factory,Prototype或Builder發展(更靈活,更復雜),因為設計師發現需要更多靈活性的地方

  2. 抽象工廠類通常使用工廠方法實現,但也可以使用Prototype實現


查看完整回答
反對 回復 2019-08-06
  • 3 回答
  • 0 關注
  • 731 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號