大家在開發中應該都使用過或者看到過sqlsessionfactory或者beanfactory,這就是使用工廠模式來生產物件。工廠模式用於封裝和管理物件的建立,分離物件的建立者和呼叫者,實現與物件解耦的目的。
工廠模式可以分為:
簡單工廠通過接收的引數的不同來返回不同的物件例項,涉及到的角色有:
**如下:
// 抽象產品
public
inte***ce
car// 具體產品1
public
class
audi
implements
car}
// 具體產品2
public
class
benz
implements
car}
// 具體工廠,用於生成產品
public
class
******factory
elseif(
"benz"
.equals
(type)
)else
}// 方式2,直接呼叫生成對應的產品物件的方法
public
static car getaudi()
public
static car getbenz()
}// 呼叫者
public
class
******factorytest
}
類圖如下:
可以看到,如果再增加一種產品,則需要修改工廠類,故這種工廠模式適用於產品物件較少,且產品固定的需求 。其實我們在一般的專案中使用簡單工廠就足夠了。
為了避免簡單工廠不滿足開閉原則的缺點,增加產品而不需要去修改工廠類,可以使用工廠方法模式,增加產品的同時通過增加乙個對應的工廠類來生產對應的產品,涉及的角色有:
**如下:
// 抽象產品
public
inte***ce
car// 具體產品1
public
class
audi
implements
car}
// 具體產品2
public
class
benz
implements
car}
// 抽象工廠
public
inte***ce
ca***ctory
// 具體工廠1
public
class
audifactory
implements
ca***ctory
}// 具體工廠2
public
class
benzfactory
implements
ca***ctory
}// 呼叫者
public
class
factorymethodtest
}
類圖如下:
可以看到,如果新增加一種具體產品,就需要為其增加乙個具體工廠類用於生產該產品。
抽象工廠用於生產一族產品。涉及的角色有:
**如下:
// 抽象產品a
public
inte***ce
engine
// 具體產品a1
public
class
highengine
implements
engine
}// 具體產品a2
public
class
lowengine
implements
engine
}// 抽象產品b
public
inte***ce
tyre
// 具體產品b1
public
class
hightyre
implements
tyre
}// 具體產品b2
public
class
lowtyre
implements
tyre
}// 抽象工廠
public
inte***ce
ca***ctory
// 具體工廠a1b1
public
class
highca***ctory
implements
ca***ctory
@override
public hightyre createtyre()
}// 具體工廠a2b2
public
class
lowca***ctory
implements
ca***ctory
@override
public lowtyre createtyre()
}// 呼叫者
public
class
abstractfactorytest
}
類圖如下:
可以看到通過具體工廠a1b1和a2b2可以生產出不同的產品族,在產品固定的情況下,可以通過新增具體工廠類,來組合生成不同的產品族,比如a1b2或者a2b1。但是如果要增加新的產品的話,比如增加產品c,那就需要去修改抽象工廠和具體工廠,就不適合了。
二 設計模式 工廠模式
一.傳統時以pizza類舉例,乙個抽象類pizza,由幾個pizza實現類實現,主餐廳看看客戶點什麼便生產,但是如果需要增加新的pizza品種,則要增加乙個新的實現類,然後主餐廳裡增加對邏輯的判斷,顯然,違背了開放關閉原則。所以 工廠模式為解決某些需要生產大量一批類的問題 二.簡單工廠模式 定義了乙...
設計模式(二)工廠模式
與 模式不同,生產模式隱藏過程,只關注結果 簡單工廠,工廠方法,抽象工廠 一,簡單工廠模式 public inte ce car public class aodi implements car public class baoma implements car public class facto...
設計模式(二) 工廠模式
前言 我在面試的時候,有時候會問到候選人有沒有熟悉的設計模式,一般大部分候選人會選擇說熟悉單例和工廠 也有部分人會說熟悉觀察者 如果我進一步問候選人是如何應用工廠模式的,10個候選人有10個會舉連線sqlserver,oracle,mysql等不同資料庫時會用工廠模式產生不同的連線的例子。omg,我...