java 抽象工厂 类图_spring学习中常用到的工厂,抽象工厂学习 | 学步园
工廠模式有簡單工廠模式,工廠方法模式和抽象工廠模式幾種形態。其中簡單工廠模式和工廠方法模式已經在前面作過介紹。在這里,我們來介紹抽象工廠模式。
抽象工廠模式是所有形態的工廠模式中最為抽象和最具廣泛性的一種形態。
抽象工廠模式的定義
抽象工廠模式是工廠方法模式的進一步擴廣化和抽象化。我們給出抽象工廠模式的類圖定義如下。
圖1. 抽象工廠模式的類圖定義
從上圖可以看出,簡單工廠模式涉及到以下的角色
抽象工廠(AbstractFactory)類或接口
擔任這個角色的是工廠方法模式的核心,它是與應用程序無關的。任何在模式中創立對象的工廠類必須實現這個接口,或繼承這個類。
實工廠類 (Conrete Factory)
擔任這個角色的是與應用程序緊密相關的,直接在應用程序調用下,創立產品實例的那樣一些類。
抽象產品 (Abstract Product)
擔任這個角色的類是工廠方法模式所創立的對象的父類,或它們共同擁有的接口。
實產品 (Concrete Product)
擔任這個角色的類是工廠方法模式所創立的任何對象所屬的類。
怎么這個類圖和工廠方法模式的類圖看起來是一樣的?
是的,圖是一樣的,但是含義有很大的不同。必須指出,在抽象工廠模式中,抽象產品 (AbstractProduct) 可能是一個或多個,從而構成一個或多個產品族(Product Family)。 在只有一個產品族的情況下,抽象工廠模式實際上退化到工廠方法模式。在上面的類圖中,只給出了一個產品族,相當于位圖中的一個點,而完整的位圖應當是三維的,如下圖。
圖2. 抽象工廠模式的位圖
從位圖可以清楚地看到,與紙面垂直的數軸,即第三維軸,是代表產品族的數軸。上面的位圖中展示的是有兩個產品族,族A和族B的情形。
在只有一個產品族時,第三維就坍縮掉,位圖也就只剩下兩維。這時抽象工廠模式就退化得與工廠方法模式一模一樣。
在什么情形下應當使用抽象工廠模式
在以下情況下,應當考慮使用抽象工廠模式。
首先,一個系統應當不依賴于產品類實例被創立,組成,和表示的細節。這對于所有形態的工廠模式都是重要的。
其次,這個系統的產品有多于一個的產品族。
第三,同屬于同一個產品族的產品是設計成在一起使用的。這一約束必須得在系統的設計中體現出來。
最后,不同的產品以一系列的接口的面貌出現,從而使系統不依賴于接口實現的細節。
其中第二丶第三個條件是我們選用抽象工廠模式而非其它形態的工廠模式的關鍵性條件。
抽象工廠模式在小花果園系統中的實現
現在,我們在佛羅里達的渡假小屋修整好啦。接下來,一項重要而光榮的工作,就是開發小屋后面的小花園。這意味著,我們有兩處小花園需要照料,一處在北方地區,另一處在亞熱帶地區。抽象工廠模式正好適用于我們的情況。
圖3. 抽象工廠模式應用于小花果園系統中。三種不同的背景顏色可以區分工廠類,蔬菜類(第一產品族),和水果類的類圖(第二產品族)
兩處花園就相當于兩個產品族。顯然,給北方花園的植物是要種植在一起的,給南方花園的植物是要另種植在一起的。這種分別應當體現在系統的設計上面。這就滿足了應當使用抽象工廠模式的第二和第三個條件。
相關代碼如下:
創建JAVA工程
新建三個包:
分別為:factory.impl? 存放接口
factory.action? 存放類
factory.test??? 測試類
源代碼如下:可運行:
1. FruitIF 接口
package factory.impl;
/**
* 類說明???? 水果接口
* @author?? zhaoguoli
* @version? v1.0? 創建時間:2009-4-10 下午02:09:11
*/
public interface FruitIF {
public String getName();
}
2.Gardener 接口
package factory.impl;
/**
* 類說明????? 園藝愛好者接口類
* @author?? zhaoguoli
* @version? v1.0? 創建時間:2009-4-10 下午01:57:59
*/
public interface Gardener {
// 返回蔬菜類接口
public VeggieIF createVeggie(String name);
// 返回水果類接口
public FruitIF createFruit(String name) ;
}
3.FruitIF? 接口
package factory.impl;
/**
* 類說明???? 水果接口
* @author?? zhaoguoli
* @version? v1.0? 創建時間:2009-4-10 下午02:09:11
*/
public interface FruitIF {
public String getName();
}
package factory.action;
import factory.impl.FruitIF;
/**
* 類說明???? 南方水果實現類
* @author?? zhaoguoli
* @version? v1.0? 創建時間:2009-4-10 下午02:14:09
*/
public class NorthernFruit implements FruitIF {
public String name;
public NorthernFruit(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package factory.action;
import factory.impl.FruitIF;
import factory.impl.Gardener;
import factory.impl.VeggieIF;
/**
* 類說明 南方園藝受好者
*
* @author zhaoguoli
* @version v1.0 創建時間:2009-4-10 下午01:59:25
*/
public class NorthernGardener implements Gardener {
// 返回蔬菜類接口
public VeggieIF createVeggie(String name) {
return new NorthernVeggie(name);
}
// 返回水果類接口
public FruitIF createFruit(String name) {
return new NorthernFruit(name);
}
}
package factory.action;
import factory.impl.VeggieIF;
/**
* 類說明???? 南方菜實現類
* @author?? zhaoguoli
* @version? v1.0? 創建時間:2009-4-10 下午02:11:58
*/
public class NorthernVeggie implements VeggieIF {
private String name;
public NorthernVeggie(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package factory.action;
import factory.impl.FruitIF;
/**
* 類說明???? 北方水果實現類
* @author?? zhaoguoli
* @version? v1.0? 創建時間:2009-4-10 下午02:20:57
*/
public class SouthernFruit implements FruitIF {
public String name;
public SouthernFruit(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package factory.action;
import factory.impl.FruitIF;
import factory.impl.Gardener;
import factory.impl.VeggieIF;
/**
* 類說明
* @author?? zhaoguoli
* @version? v1.0? 創建時間:2009-4-10 下午02:23:52
*/
public class SouthernGardener implements Gardener {
// 返回蔬菜類接口
public VeggieIF createVeggie(String name) {
return new SouthernVeggie(name);
}
// 返回水果類接口
public FruitIF createFruit(String name) {
return new SouthernFruit(name);
}
}
package factory.action;
import factory.impl.VeggieIF;
/**
* 類說明???? 北方菜實現類
* @author?? zhaoguoli
* @version? v1.0? 創建時間:2009-4-10 下午02:22:02
*/
public class SouthernVeggie implements VeggieIF {
public String name;
public SouthernVeggie(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package factory.test;
import factory.action.NorthernGardener;
import factory.action.SouthernGardener;
import factory.impl.Gardener;
/**
* 類說明???? 測試抽象工廠模式
* @author?? zhaoguoli
* @version? v1.0? 創建時間:2009-4-10 下午02:26:18
*/
public class FactoryTest {
/**
* 方法說明:
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成方法存根
// 南方園藝者生產花和菜
String name = null;
// 南方園藝者生產花和菜
NorthernGardener northernGardener = new NorthernGardener();
Gardener gardener = (Gardener)northernGardener;
name = "香蕉";
System.out.println(northernGardener.createFruit(name).getName());
name = "南菜";
System.out.println(northernGardener.createVeggie(name).getName());
// 北方園藝者生產花和菜
SouthernGardener southernGardener = new SouthernGardener();
name = "蘋果";
System.out.println(southernGardener.createFruit(name).getName());
name = "北菜";
System.out.println(southernGardener.createVeggie(name).getName());
}
}
運行結果如下:
香蕉
南菜
蘋果
北菜
spring使用時,會將園藝者接口中也定義方法,一切盡量用接口。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java 抽象工厂 类图_spring学习中常用到的工厂,抽象工厂学习 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#(服务器)与java(客户端)通过s
- 下一篇: java并发编程实践 读书笔记_Java