簡單工廠(****** factory pattern)
簡單工廠模式,把物件(統一介面)的建立封裝起來,而不去用了解物件所代表的真正的實現類及其初始化過程。我們只需要把引數傳遞給簡單工廠,工廠就會根據你的需要返回相應的產品物件。示例**如下:
這樣做的好處就是把耦合放進了factory,呼叫方和product不再耦合,放在factory的原因也是因為呼叫方是多變的,而factory是固定的(相對而言),也就是說比如對product1和product2而言,車間a會用到,車間b也會用到,如果不用factory的話,車間a和車間b的**就會和product1和product2耦合,如果現在要求根據呼叫方上下文改變,如果車間a只能用product1,車間b只能用product2,那麼我們要同時修改車間a和車間b的**,或者有更多的車間需要處理呢;如果有factory的話呢,我只要在factory中根據上下文來判斷返回相應的product就可以了。
方法工廠(method factory pattern)
簡單工廠模式把所有的重心放到工廠類上,一旦向系統增加新的產品,就必須修改工廠類,不滿足開閉原則(對修改關閉,對擴充套件開放);工廠方法模式提供乙個抽象的工廠介面,在不同的產品結構上實現不同的產品工廠具體類來建立該層次中的產品,通常乙個具體工廠建立乙個具體產品。在新增產品的時候,只需要實現新的對應工廠就可以滿足需要,是符合開閉原則的。
示例**如下:
對不同的產品的例項化,由不同的工廠來實現,每一種工廠都是生產特定的產品。
但是我有個疑問就是,雖然每個需要產品的呼叫方都不再和具體的產品耦合,但每乙個都會和乙個特定的工廠進行耦合。理解:每個呼叫方都仍不會受到產品耦合的關係,有工廠這一層次,讓這種易變性仍然保持在工廠的層次。並且在新增product和呼叫方的時候不會再影響到原先的工廠(簡單工廠的話就要修改簡單工廠類了),只需要增加新的工廠類並在新的呼叫方中呼叫新的工廠就可以了。
抽象工廠(abstract factory)
乙個工廠有時不光生產一種產品,比如乙個青銅器的兵工廠,可能不光生產青銅刀,還生產青銅劍,屬於乙個系列的產品。現在生產工藝公升級,現在生產效能更好的鐵刀,鐵劍,原先的模具,融爐都不再適用,而且為了滿足過渡需要,原先的工廠肯定也要保留,而且兩個工廠有很多相似之處可以提取出來。兩個工廠生產的產品也有很多相似之處,但乙個工廠生產的不同產品的相同之處只在於他們用的生產工藝和處理過程是一樣的,但產品本身是不同的。但在不同的工廠中,產品卻有類似的,如青銅刀-鐵刀,青銅劍-鐵劍。
具體的工廠生產的是乙個產品系列內的產品,不同工廠生產的是不同代的產品。
抽象工廠的uml類圖大致類似上面,兩個具體工廠都繼承自統一的抽象工廠,抽象工廠生產乙個系統的產品(即iproduct1 和iproduct2),兩個具體工廠就生成具體系列的產品。
總結簡單工廠,方法工廠和抽象工廠沒有優劣之分,只有不同的應用場景而已:
如果產品的種類是不變的,只是想隱藏產品的例項化過程和具體的產品,就可以用簡單工廠,也就是沒有啥是變化的。
如果產品種類是不定的,是變化的,如果很多的話,若用簡單工廠的話,簡單工廠的維護就會變大,而且會對已有類產生影響(原先的**都會因為簡單工廠類的修改而重新測試)。而且傳入簡單工廠的引數與產品沒有明確的對應,維護起來不好。在這種場景下就可以用方法工廠,對新增產品只要增加新的工廠,在新的呼叫方呼叫相應工廠就ok了,可以完全解決上面的問題。
抽象工廠處理的場景是,產品是分代的,且每個工廠都不止生產一種型別的產品(如青銅器兵工廠生產青銅刀和青銅劍,鐵兵工廠生廠鐵刀和鐵劍),如果工廠都生產一種型別(具體點就是功用啥幾乎都不一樣,在類中表現為不同介面)的產品,就退化為方法工廠了。個人感覺,方法工廠就是抽象工廠的乙個特例。
工廠模式也用了不少,特別是ms的petshop中對資料庫的訪問,通過工廠模式可以達到自由切換sql 和 oracle 資料庫。近來也在看設計模式的書,發現工廠模式還是有不少的擴充套件。結合書中的知識和我自己理解,從**的角度來比較工廠模式各變種。
1:簡單工廠模式:其作用是例項化物件而不需要客戶了解這個物件屬於那個具體的子類。
using system;
using system.collections;
public class myclass
}public class factoryvehicle}}
public inte***ce ivehicle
public class car:ivehicle
}public class boat:ivehicle
}
2:抽象工廠:即將工廠方法也抽象出來,由具體的子類來例項化工廠。產品建立部分和簡單工廠模式相同。
using system;
using system.collections;
public class myclass
}public inte***ce factoryvehicle
public class factorycar:factoryvehicle
}public class factoryboat:factoryvehicle
}public inte***ce ivehicle
public class car:ivehicle
}public class boat:ivehicle
}
3:反射工廠模式: 其實就是通過反射的方式來獲得具體例項化是那個類。
using system;
using system.collections;
using system.reflection;
public class myclass
}public class reflectfactory
}public class factoryboat:factoryvehicle
}public class factorycar:factoryvehicle
}public inte***ce factoryvehicle
public inte***ce ivehicle
public class car:ivehicle
}public class boat:ivehicle
}
簡單工廠,工廠方法,抽象工廠
簡單工廠,工廠方法,抽象工廠都屬於設計模式中的建立型模式。其主要功能都是幫助我們把物件的例項化部分抽取了出來,優化了系統的架構,並且增強了系統的擴充套件性。本文是本人對這三種模式學習後的乙個小結以及對他們之間的區別的理解。簡單工廠 簡單工廠模式的工廠類一般是使用靜態方法,通過接收的引數的不同來返回不...
簡單工廠 工廠方法 抽象工廠
簡單工廠 乙個工廠類 根據傳入的參量決定建立出哪一種產品類的例項 直接乙個工廠類,內部通過 swith operator add類實現該介面 adddao implements dao dao的實現類 客戶端 dao dao new adddao dao.createoper 產生物件 這樣如果需要...
簡單工廠 工廠方法 抽象工廠
一 簡單工廠 factory 集中管理物件的產生,業務 只需要呼叫相應的方法,傳入不同的引數區分物件,就能得到想要的物件了 把業務 和對應的物件解耦 建立乙個抽象類 public abstract class cellphone public abstract void show 建立實現抽象類的實...