設計模式 工廠模式

2021-04-22 16:30:32 字數 4019 閱讀 7112

在軟體系統中,經常面臨著「某個物件」由於需求的變化,物件的具體實現面臨著劇烈的變化。為了應對這種變化我們抽象出它比較穩定的介面,隔離出「這個易變物件」的變化,從而保持系統中「其它依賴該物件的物件」不隨著需求的改變而改變,這就是要說的factory method模式了。

定義乙個使用者建立物件的介面,讓子類決定例項化哪乙個類。factory method使乙個類的例項化延遲到其子類。

簡單工廠:

例子:如果生活中有兩種燈一種是燈泡,另一種是燈管,它們都有兩個方法turnon()和turnoff(),有兩個人,乙個人會做燈泡,乙個人會做燈管,他們兩個各自做各自的。 如 果我要訂兩批燈一批是燈泡一批是燈管的話。那我要分別派人去找兩個人分別談判、溝通兩次,再分別派人取貨,但有一天我派去取貨的人喝醉了,去做燈泡的人那 裡去要燈管,又去做燈管的人那裡取燈泡,這樣可就出錯了。後來這兩個人合做開了一家燈工廠,擁有兩條生產線,這個工廠能同時造燈泡和燈管,那我只需與這家 工廠談判一次就可以了,也只需派人來這個工廠的銷售部取貨就可以了。當然銷售部不能只銷售燈泡,也不能只銷售燈管,是二者都銷售,根據訂單不同銷售的內容 也不同。

using system;

public abstract class light

public abstract void turnon();

public abstract void turnoff();

public class bulblight : light

public override void turnon()

console.writeline("bulb light is turned on");

public override void turnoff()

console.writeline("bulb light is turned off");

public class tubelight : light

public override void turnon()

console.writeline("tube light is turned on");

public override void turnoff()

console.writeline("tube light is turned off");

public class light******factory

public light create(string lighttype)

if(lighttype == "bulb")

return new bulblight();

else if(lighttype == "tube")

return new tubelight();

else

return null;

public class client

public static void

main

()light******factory lsf = new light******factory();

light l = lsf.create("bulb");

l.turnon();

l.turnoff();

console.writeline("-----------------");

l = lsf.create("tube");

l.turnon();

l.turnoff();

工廠類角色creator (light******factory)工廠類在客戶端的直接控制下(create方法)建立產品物件。

抽象產品角色product (light)定義簡單工廠建立的物件的父類或它們共同擁有的介面。可以是乙個類、抽象類或介面。

具體產品角色concreteproduct (bulblight, tubelight)定義工廠具體加工出的物件。

優點:

工廠類可以決定建立哪乙個產品類的例項,客戶端可以免除直接建立產品物件的責任,而僅僅"消費"產品。實現了對責任的分割。

缺點:

工廠類集中了所有產品建立邏輯,一旦工廠不能正常工作,整個系統都要受到影響。

系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯(生產線)。

複雜工廠:

在第二種工廠中核心工廠不再負責所有產品的建立,而是將具體建立工作交給子類去做。核心工廠僅僅負責給出具體工廠必須實現的介面,而不接觸某乙個產品類被例項化這種細節。這可以在引進新產品的時候增加乙個新的具體工廠就可以了,而不用去大改現有的工廠。

在第二種工廠中,工廠類與產品類往往具有平行的等級結構,它們之間一一對應。

例子:如果上面例子中要生產一種新產品-探照燈,那就得把原來的兩條生產線進行大的修改,生產完成後再把生產線改回來,這樣就太影響工作了,於是他們想出了乙個方法再建一條生產線,專門生產探照燈。

using system;

public abstract   class light

public abstract void turnon();

public abstract void turnoff();

public class bulblight : light

public override void turnon()

public override void turnoff()

public class tubelight : light

public override void turnon()

public override void turnoff()

public abstract   class creator

public abstract light factory();

public class bulbcreator : creator

public override light factory()

public class tubecreator : creator

public override light factory()

public class client

public static void

main

()creator c1 = new bulbcreator();

creator c2 = new tubecreator();

light l1 = c1.factory();

light l2 = c2.factory();

l1.turnon();

l1.turnoff();

console.writeline("-----------------");

l2.turnon();

l2.turnoff();

抽象工廠(creator)角色:是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。

具體工廠(concrete creator)角色:這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式呼叫以建立產品物件。在上圖中有兩個這樣的角色:bulbcreator與tubecreator。

抽象產品(product)角色:工廠方法模式所建立的物件的超型別,也就是產品物件的共同父類或共同擁有的介面。在上圖中,這個角色是light。

具體產品(concrete product)角色:這個角色實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應。

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

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

設計模式 工廠設計模式

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

設計模式 工廠設計模式

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