設計模式筆記 3 抽象工廠模式(建立型)

2021-09-05 22:04:04 字數 2939 閱讀 7263

提供乙個藉口,讓該介面負責建立一系列相關或者相互依賴的物件,無需指定他們具體的類。

在軟體系統中經常面臨著一系列相互依賴的物件的建立的工作,同時由於需求的變化,往往存在著更對系列物件的建立。

常規的物件建立的方法,直接使用new關鍵字

road road = new 

road();

這樣直接new會有乙個問題,不能應對具體例項化型別的變化,比如說有不同的road型別需要被例項化的時候就需要來更改此處的**。解決這個問題的辦法就是封裝變化點,變化點也是相對而言的,比如在專案中有些地方會經常更具客戶的需求而作改動,我們就可以將其封裝起來。拿上面的那行**來說,因為可能有不同型別的road需要被建立,變化點就是「物件的建立」。

一種比較簡單的解決方法,看下面的**

public class 

roadfactory

}

//呼叫的**

public class

test

}

現在需求有了改變,需要建立一種另一種型別的路highroad,只需更改工廠類的**就可以,呼叫的地方不用做修改,如下

public class 

roadfactory

}

現在需求又有了改變,比如在遊戲的開發場景中,我們需要構建道路、房屋、叢林等等物件,按照上面的思路我 可以寫成下面這樣的**

//客戶程式

public class

test

}public class

gameobjectfactory

public static

building createbuilding()

public static

jungle createjungle()

}

以上的**屬於一種簡單工廠的實現,將物件的建立放到乙個單獨的工廠類中,實現了和客戶程式的分離,不過 不能應對不同系列物件的變化,比如有不同風格的遊戲場景,對於要實現不同風格場景中的道路、房屋等物件的 建立,上面的**就難以實現。對於有不同系列物件這樣的需求,變化點轉移到了工廠類的內部,上面的**中 物件的建立是在工廠類中的靜態方法中寫死的,不能應對變化,如果我們另外建立乙個能適應其他系列的工廠類, 那麼客戶程式就會發生改變,這不是我們希望看到的。要解決此類問題必須使用物件導向的技術來封裝變化點。

結構圖

上面的結構圖中abstractfactory為建立物件的抽象工廠類,abstractproducta、abstractproductb為具 體物件的抽象類,拿到上面的例子中就是道路、房屋、叢林等的抽象。他們的子類producta1、productb1就是 指不同風格系列的是實現,這也正是抽象工廠模式要解決的問題。圖中還可以看出客戶程式依賴的是抽象的部分 而沒有涉及到具體的實現,也就是說當需求改變的時候,客戶程式是不用變的。下面就來看**是如何實現。

首先建立抽象工廠類

public abstract class 

facilitiesfactory

因為遊戲場景中有道路、房屋、叢林這三種物件,需要建立這三個物件的抽象類,如果有更多的物件,需要增加其他物件的抽象類。

//道路

public abstract class

road

//房屋

public abstract class

building

//叢林

public abstract class

jungle

下面的客戶程式**都是對抽象類之間的操作

//客戶程式

public class

gamemanage

/// ///

建立一些基礎設施的物件

///

public void buildgamefacilities()

public void play()

}

在應用程式中使用上面的**

public class 

}

上面的**中?的地方應該傳入什麼引數呢?從gamemanage類的建構函式中可以看出是乙個抽象工廠型別,大 家都知道,抽象類是不能建立例項的,所以問號的地方應該是abstractfactory類的子類。假設現在有乙個現代 風格系列的遊戲場景,就需要建立一組現在的道路、房屋、叢林,如下:

//道路

public class

modernroad:road

//房屋

public class

modernbuilding:building

//叢林

public class

modernjungle:jungle

下面建立現代風格的工廠類

public class 

modernfacilitiesfactory:facilitiesfactory

public override

road createroad()

public override

jungle createjungle()

}

public class 

}

結構圖

如果有新的需求,需要一套古典風格或者是夢幻風格的的遊戲場景,只需要

1 建立一套新的相應風格的物件繼承道路、房屋、叢林等的抽象類

2 建立乙個相應風格的工廠繼承抽象工廠

整個過程中,只是在外部擴充套件一些類,gamemanage並沒有做任何的改變

返回開篇(索引)

設計模式3 抽象工廠模式(建立型模式)

抽象工廠模式是工廠模式的公升級。相對而言,抽象工廠模式並不像工廠模式那麼好理解,看了不少網上部落格的描述,感覺都說說的雲裡霧裡,個人覺得還是把抽象問題具體化更好。推崇 大話設計模式 中的講解模式。本文講以更通俗的語言,結合 大話設計模式 中使用的例項,把抽象工廠模式理清楚。先總結下個人對工廠模式的理...

抽象工廠模式 設計模式3之抽象工廠模式

工廠方法模式中工廠只負責同類產品的生產。比如電視機工廠不應該生產汽車。然而現實生活中有很多綜合型的工廠,比如有些電視工廠不僅生產電視機,還會生產與之配套的機頂盒。那麼抽象工廠模式隨之誕生,這種模式將考慮多種型別產品的生產。我們總結下 工廠方法模式只考慮成產同一等級級的產品抽象方法模式考慮生產多等級的...

Java設計模式筆記(3)抽象工廠模式

抽象工廠模式是工廠方法模式的公升級版本,在有多個業務品種 業務分類時,通過抽象工廠模式產生需要的物件是一種非常好的解決方式。package com.juno.abstractfactorypattern 抽象產品類 public abstract class abstractproducta 每個產...