今天談一下對工廠模式學習的總結。
看完視頻和文章之后要自己表述工廠模式,總是感覺無從說起,不知道怎么去定義工廠模式,反復看了幾遍之后終于理解一點。
自己理解工廠模式是通過這兩種模式的特點來理解和定義的,首先工廠模式有簡單工廠模式(不在23中設計模式中),工廠方法模式,抽象工廠模式,把三種模式對比來定義,根據不同模式的特點來記憶。
工廠模式是讓對象的創建和使用分離,每次使用時不用自己創建,把創建對象的過程交給工廠來完成。
定義(僅供參考 -- 理解后再形成自己的定義)
工廠方法模式定義:定義創建一個產品的工廠接口,將這一個產品的具體創建方法延遲到子類工廠實現,當需要使用這個產品時通過工廠獲取。
如果只有一類產品定義為簡單工廠模式了.
抽象工廠模式定義:定義創建一系列產品的工廠接口,將這一系列產品的具體創建過程延遲到子類工廠,使用時通過工廠就可以創建一系列的產品。
優缺點對比
工廠方法模式:
優點-可以進行不同產品的擴展,如定義一個水果類工廠就可以創建不同的水果,現在要擴展一個蔬菜類產品就再定義一個蔬菜類工廠。
缺點-單要創建一系列產品類的時候,會出現工廠泛濫,一個產品類就要創建一個產品接口,一個產品工廠,增加系統復雜性。比如我還要創建動物類,工具類等,
工廠將越來越多。
抽象工廠模式:
優點-可以創建一系列的產品,當增加新的產品系列可以不用修改代碼,如建了一個海爾系列的電器,再建一個格力系列的就可以只增加一個名稱。
缺點-當增加一個產品時要改動工廠所有的接口。如工廠創建的是洗衣機,電視,空調,現在要增加一個熱水器的產品,那么所有工廠子類都要增加。
模式結構對比
工廠模式的結構:
1.抽象產品:Product
2.抽象工廠:AbstractFactory
3.具體產品:Concrete Product
4.具體工廠:Conrete Factory
抽象工廠模式結構:
1.抽象產品系列:Product
2.抽象工廠:AbstractFactory
3.具體產品系列:Concrete Product
4.具體工廠:Conrete Factory
上代碼
工廠模式:
//產品
public interfaceProduct {public voidrun();
}//工廠
public interfaceFactory {publicProduct createFactory();
}//車類產品和工廠
public class Car implementsProduct {
@Overridepublic voidrun() {
System.out.println("駕車起飛。。。。。。");
}
}public class CarFactory implementsFactory {
@OverridepublicProduct createFactory() {return newCar();
}
}//食物類產品和工廠
public class Food implementsProduct{
@Overridepublic voidrun() {
System.out.println("eat.......");
}
}public class FoodFactory implementsFactory {
@OverridepublicProduct createFactory() {return newFood();
}
}//測試代碼
public classTestFactory {public static voidmain(String[] args) {
Factory f= newCarFactory();//Factory f = new FoodFactory();
Product p =f.createFactory();
p.run();
}
}
抽象工廠模式:
//產品系列
public interfaceTV {public voidshow();
}public interfaceWashing {public voidwash();
}public interfaceAir {public voidfever();
}//產品工廠
public interfaceAbstractFactory {publicTV crateTV();publicAir createAir();publicWashing createWashing();
}//HR系列產品
public class HRTelevision implementsTV{
@Overridepublic voidshow() {
System.out.println("海爾電視。。。。。");
}
}public class HRWarshing implementsWashing{
@Overridepublic voidwash() {
System.out.println("海爾洗衣機。。。");
}
}public class HRAir implementsAir{
@Overridepublic voidfever() {
System.out.println("海爾空調。。。");
}
}//HR系列產品工廠
public class HRFactory implementsAbstractFactory {
@OverridepublicTV crateTV() {return newHRTelevision();
}
@OverridepublicAir createAir() {return newHRAir();
}
@OverridepublicWashing createWashing() {return newHRWarshing();
}
}//GL系列產品
public class GLTelevision implementsTV{
@Overridepublic voidshow() {
System.out.println("格力電視。。。。");
}
}public class GLAir implementsAir {
@Overridepublic voidfever() {
System.out.println("格力空調。。。。。");
}
}public class GLWashing implementsWashing {
@Overridepublic voidwash() {
System.out.println("格力洗衣機。。。");
}
}//GL系列產品工廠
public class GLFactory implementsAbstractFactory {
@OverridepublicTV crateTV() {return newGLTelevision();
}
@OverridepublicAir createAir() {return newGLAir() ;
}
@OverridepublicWashing createWashing() {return newGLWashing();
}
}//測試代碼
public classTest {public static voidmain(String[] args) {//AbstractFactory f = new GLFactory();
AbstractFactory f = newHRFactory();
TV tv=f.crateTV();
Air air=f.createAir();
Washing warsh=f.createWashing();
tv.show();
air.fever();
warsh.wash();
}
}
測試代碼中只需要修改工廠類就可以實現生產不同的產品和不同的產品系列了, 當工廠可以通過配置文件來取的時候就不用更改任何代碼就實現了,實際生產中工廠都可以通過快速編碼來配置,很多成型的產品都是直接配置就能完成整個系統的初始化了。
這是自己理解并輸入的第二篇關于設計模式的筆記了,只是看一遍和根據自己的思路寫一遍真的是完全不同的感覺,如果只是看一遍過一天可能就忘記了, 如果自己思路清晰之后再自己設計下,根據思路寫一遍如果有問題又回去看看具體細節,一路記下來差不多就能搞定了,希望對路過的你有幫助。
后續繼續學習中。。。