工廠模式
核心作用:實現(xiàn)創(chuàng)建者和調(diào)用者的分離
詳細分類:
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
工廠模式滿足的OOP原則:
- 開閉原則:一個軟件的實體應當對擴展開放,對修改關閉
- 依賴倒轉原則:要針對接口編程,不要針對實現(xiàn)編程
- 迪米特法則:只與你直接的朋友通信,而避免和陌生人通信
本質(zhì):實例化對象不使用new,用工廠方法代替
來一個簡單的例子
創(chuàng)建一個汽車接口
public interface Car{
void name();
}
創(chuàng)建類
public class WuLin implements Car{
public void name(){
System.out.println("WuLin");
}
}
public class Tesla implements Car{
public void name(){
System.out.println("Tesla");
}
}
1. 簡單工廠模式(靜態(tài)工廠)
創(chuàng)建總工廠
/**
* 消費者只需要面對工廠,從工廠中調(diào)用靜態(tài)方法返回,不需要自己new
* 但是每次新增車輛品種都需要修改工廠
*/
public class CarFactory{
// 方法一
public static Car getCar(String car){
if(car.equals("WuLin")){
return new WuLin();
}
if(car.equals("Tesla")){
return new Tesla();
}
return null;
}
// 方法二 比原來好一點,如果添加新車不用在原來方法的基礎上修改邏輯
public static Car getWuLin(){
return new WuLin();
}
public static Car getTesla(){
return new Tesla();
}
}
2. 工廠方法模式
創(chuàng)建工廠接口
public interface CarFactory{
Car getCar();
}
創(chuàng)建Tesla工廠
public class TeslaFactory implements CarFactory{
public Car getCar(){
return new Tesla();
}
}
創(chuàng)建WuLin工廠
public class WuLinFactory implements CarFactory{
public Car getCar(){
return new WuLin();
}
}
從這可以看出工廠方法模式就是抽出總工廠接口
每個種類分別是創(chuàng)建自己的工廠實現(xiàn)工廠接口的方法(橫向擴展)
每次新增一種車輛就創(chuàng)建一個自己的工廠實現(xiàn)接口
不用修改原來的代碼, 符合開閉原則
但是每一次擴展都會多出一個擴展類(該類的工廠)
應用場景
- SpringIOC容器創(chuàng)建管理對象就是工廠模式(sqlSessionBeanFactory)
- 反射中Class對象的newInstance()方法
- JDBC中的Connection對象的獲取
3. 抽象工廠模式
一個超級工廠,創(chuàng)建其他工廠的工廠
再來一個例子
創(chuàng)建兩個產(chǎn)品
public interface Phone{
void startup();
void shutdown();
void callup();
void sendSMS();
}
public interface Router{
void startup();
void shutdown();
void setting();
}
創(chuàng)建兩個公司類分別實現(xiàn)兩個產(chǎn)品
// Phone
public class HuaweiPhone implements Phone{
public void startup(){
System.out.println("Huawei開機");
}
public void shutdown(){
System.out.println("Huawei關機");
}
public void callup(){
System.out.println("Huawei打電話");
}
public void sendSMS(){
System.out.println("Huawei發(fā)短信");
}
}
public class XiaomiPhone implements Phone{
public void startup(){
System.out.println("Xiaomi開機");
}
public void shutdown(){
System.out.println("Xiaomi關機");
}
public void callup(){
System.out.println("Xiaomi打電話");
}
public void sendSMS(){
System.out.println("Xiaomi發(fā)短信");
}
}
// Router
public class HuaweiRouter implements Router{
public void startup(){
System.out.println("Huawei開機");
}
public void shutdown(){
System.out.println("Huawei關機");
}
public void setting(){
System.out.println("Huawei設置");
}
}
public class XiaomiRouter implements Router{
public void startup(){
System.out.println("Xiaomi開機");
}
public void shutdown(){
System.out.println("Xiaomi關機");
}
public void setting(){
System.out.println("Xiaomi設置");
}
}
創(chuàng)建超級工廠
// 決定生產(chǎn)什么產(chǎn)品
public interface ProductFactory{
// 生產(chǎn)手機
Phone phoneProduct();
// 生產(chǎn)路由器
Roter routerProduct();
}
創(chuàng)建產(chǎn)品工廠(實現(xiàn)超級工廠)
// 具體實現(xiàn)
public class HuaweiFactory implements ProductFactory{
public Phone phoneProduct(){
return new HuaweiPhone();
}
public Router routerProduct(){
return new HuaweiRouter();
}
}
public class XiaomiFactory implements ProductFactory{
public Phone phoneProduct(){
return new XiaomiPhone();
}
public Router routerProduct(){
return new XiaomiRouter();
}
}
定義一個產(chǎn)品,這個產(chǎn)品有很多的品牌,
品牌都實現(xiàn)了這個產(chǎn)品需要的功能,
定義一個超級工廠,去創(chuàng)建這些品牌的工廠,
超級工廠有生產(chǎn)這些產(chǎn)品的抽象方法,交給不同品牌的工廠去生產(chǎn)各自品牌的產(chǎn)品
優(yōu)點:
- 無需關心創(chuàng)建細節(jié)
- 將系列產(chǎn)品統(tǒng)一到一起創(chuàng)建
缺點:
- 擴展困難
- 增加抽象性和理解難度
超級工廠是管理多個產(chǎn)品線的工廠(不負責產(chǎn)品),而前兩個模式是管理單個產(chǎn)品線
比如說多增加一個生產(chǎn)筆記本, 只需要在抽象工廠模式的超級工廠里增加抽象方法即可