設計模式 工廠模式

2021-07-22 09:42:26 字數 4646 閱讀 4935

總結一下這段時間對於工廠模式的學習理解。

工廠模式總的來說可以簡單分為三類(簡單工廠模式,工廠方法模式,抽象工廠模式),但是在大話設計模式一書中只列出了後兩類,在我們的實際應用當中,簡單工廠模式卻是很容易使用到的。下面分別來介紹這三類工廠模式。

在介紹之前,先說一下為什麼我們要使用工廠模式,在不使用工廠模式的情況下,我們要建立product乙個物件,通常是通過new product()來實現的,這並沒有什麼問題,但是在product類派生出兩個子類producta和productb的情況下,我們要建立乙個producta和productb,則需要new兩次,當product種類越來越多的時候,我們就可以把建立product類的職責交給乙個工廠類來管理。用乙個類來管理這些product的建立。簡單工廠模式其實就是其最簡單方便的一種實現。

product可以是基類,也可以是抽象公用介面

public inte***ce product
producta和productb則繼承product

public class producta implements product

public void functionpa()

}

public class productb implements product

public void functionpb()

}

工廠類負責管理物件的建立

public class simmplefactory 

public static productb createproductb()

}

簡單工廠模式是以靜態方法的形式建立物件的,所以也稱為靜態工廠模式,簡單工廠模式雖然實現了對物件建立的管理,但是卻不符合開閉原則,因為

如果新增類productc,需要對simmplefactory類進行修改。工廠方法模式則解決了此問題。

工廠方法模式與簡單工廠模式最大的不同是,簡單工廠模式只有乙個工廠類,而工廠方法模式則實現了統一介面的一些列的工廠類,結構上較簡單

工廠模式稍微複雜一點。

product

public inte***ce product
producta和productb

public class producta implements product

public void functionpa()

}

public class productb implements product

public void functionpb()

}

工廠介面

public inte***ce abstractfactory
工廠類

public class productafactory implements abstractfactory

}

public class productbfactory implements abstractfactory 

}

具體呼叫

producta product1;

productb product2;

void test()

輸出:

this is a producta

i can't do something like this

this is a productb

i can do something like this

工廠方法模式與靜態工廠模式相比雖然滿足了開閉原則,但是結構更為複雜,在比較簡單的系統中靜態工廠模式的優勢更為明顯,雖然擴充套件的時候需要

修改工廠類,但是僅僅只需要增加新擴充套件的類的例項化函式,修改**較少。而工廠方法模式在使用的時候需要例項化工廠類,靜態工廠模式由於使用

靜態方法,所以更加方便。在具體的專案中,到底使用哪乙個還是需要視情況而定。

工廠方法模式還衍生出一種通過泛型與反射實現的方法:

product與producta,productb同上,

工廠方法如下:

public class productfactory catch (exception e) 

return product;

}}

具體呼叫如下:

producta product1;

productb product2;

void test()

輸出:

this is a producta

i can't do something like this

this is a productb

i can do something like this

利用上述實現的工廠方法模式既符合開閉原則便於擴充套件,同時避免了建立多個工廠類,使用的時候也不需要例項化工廠類,但其效率相比較低。

抽象方法適用於產品等級劃分比較複雜的情況,其中涉及「產品族」與「產品等級」的概念。

所謂產品族,producta與productb是不同型別的產品,可稱其為不同的產品族,而producta與productb同時又有劣品(cheap)與優品(expens-

ive)之分,則劣品與優品之間就構成了產品等級。

具體例子如下:

public inte***ce product
@override

public void info()

public void functionpa()

}

public class expensiveproducta implements product

public void functionpa()

}

@override

public void info()

public void functionpb()

}

public class expensiveproductb implements product 

public void functionpb()

}

抽象工廠:

public inte***ce abstractfactory
工廠類:

public class productafactory implements abstractfactory 

@override

public product creatproductexpensive()

}

public class productbfactory implements abstractfactory 

@override

public product creatproductexpensive()

}

具體呼叫:

product product1;

product product2;

product product3;

product product4;

abstractfactory productfactory;

void test()

輸出結果:

this is a cheap producta

this is a expensive producta

this is a cheap productb

this is a expensive productb

only producta can do this

only producta can do this

only productb can do this

only productb can do this

借用大話設計模式中的一段話來總結三類工廠模式的區別:

一開始只在後花園中種蔬菜類的時候可以使用簡單工廠模式,由工廠負責生成具體的蔬菜類。

(本文例子中此時product為蔬菜類,producta與productb對應不同蔬菜種類)

但是如果後花園要引進水果類的時候簡單模式就行不通了,因此需要使用工廠方法模式,將產品類族分開。

(本文例子中此時product為果蔬類,producta與productb分別對應水果類與蔬菜類)

但是如果後花園的規模繼續擴大到地獄範圍的分割時,比如說乙個在北京,乙個在上海的時候,工廠方法模式就不夠用了,因為對兩個後花園來說,

每個後花園的植物是要被種在一起的,並且兩個後花園用工廠方法模式是無法體現其區別的。

(本文例子中此時product為果蔬類,producta與productb分別對應水果類與蔬菜類,假設北京產出的水果與蔬菜味劣品(cheap)(ps:空氣不好)

,上海產出的水果與蔬菜味優品(expensive)(其實大城市空氣都不太好))

設計模式 工廠模式 抽象工廠模式

建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...

設計模式 工廠設計模式

用於建立物件的介面,交給子類去實現 我們舉乙個生產nokia的例子 public abstract class nokiaphone先試定義了乙個抽象類,抽象出方法poweronphone 模擬手機開機的動作 public class nokia5200 extends nokiaphone pub...

設計模式 工廠設計模式

工廠模式分為工廠方法模式和抽象工廠模式 工廠方法模式分為 普通工廠模式,就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。靜態工廠...