設計模式 工廠模式

2021-10-02 14:07:12 字數 4133 閱讀 3816

顧名思義,工廠模式就是建立產品,在程式設計中稱作建立物件例項,屬於建立型模式

工廠模式分為簡單工廠模式和工廠方法模式,根據工廠的抽象程度工廠方法模式又可以分為工廠方法模式和抽象工廠模式

——簡單工廠模式:將建立例項的過程封裝在乙個類中

——工廠方法模式和抽象工廠模式:將建立例項的過程交給具體的產品工廠

——反射:使用反射機制可以解決簡單工廠模式、工廠方法模式和抽象工廠模式的弊端,在使用時捨棄掉是選擇哪一種產品還是選擇哪一種產品工廠

總之,工廠模式就是將建立例項的操作(new的過程)封裝起來,降低耦合度,提高擴充套件性

三種工廠模式有各自的應用場景,根據實際應用進行選擇,無所謂高階與低階

例如乙個工廠去生產手機

下面是不使用工廠模式的寫法:

using system;

public class mainclass

}public inte***ce phone

}public class huawei : phone

}

下面是使用簡單工廠模式的寫法:將建立例項的過程封裝到乙個單獨類中去管理

using system;

public class mainclass

}public inte***ce phone

}public class huawei : phone

}/// /// 將建立例項的過程封裝到乙個單獨類中去管理

///

public class factory

return null;}}

簡單工廠模式將建立例項的過程封裝在了乙個類中,假如現在需要增加生產小公尺品牌手機的需求,那麼就需要在factory類的switch分支中新增小公尺品牌的判斷,這樣的話我們不但對擴充套件開放了,對修改也開放了,違背了開放-封閉原則,所以就有了工廠方法模式

簡單工廠模式與工廠方法模式的區別在於簡單工廠模式把建立例項的過程封裝在了乙個類中,而工廠方法模式將創造例項的過程交給了每乙個具體例項類的工廠

下面是使用工廠方法模式的寫法:將生產具體產品的過程(創造例項)交給具體的產品工廠

using system;

public class mainclass

}public inte***ce phone

}public class huawei : phone

}/// /// 將創造例項的過程交給了每乙個具體的產品工廠

///

public inte***ce abstractfactory

}public class huaweifactory : abstractfactory

}

假如現在工廠不僅僅生產phone,還需要生產watch

下面是使用抽象工廠模式的寫法:

using system;

public class mainclass

}public inte***ce phone

public inte***ce watch

public void productionwatch()

}public class huawei : phone, watch

public void productionwatch()

}/// /// 抽象工廠中增加建立例項的介面

///

public inte***ce abstractfactory

public watch getwatch()

}public class huaweifactory : abstractfactory

public watch getwatch()

}

下面是使用簡單工廠模式對上面的**進行改寫:只需要增加乙個建立watch物件的靜態方法

using system;

public class mainclass

}public inte***ce phone

public inte***ce watch

public void productionwatch()

}public class huawei : phone, watch

public void productionwatch()

}public class factory

}public static watch getwatch(string _watchtype)}}

假如現在的需求不是生產watch,而是新增乙個小公尺的品牌,那麼使用簡單工廠模式就不太適合了,我們需要改動factory中的switch分支,又違背了開放-封閉原則

當需求導致需要增加具體類時,推薦使用抽象工廠模式

下面是使用抽象工廠模式的寫法:只需要增加xiaomifactory類去建立物件

using system;

public class mainclass

}public inte***ce phone

}public class huawei : phone

}public class xiaomi : phone

}public inte***ce abstractfactory

}public class huaweifactory : abstractfactory

}public class xiaomifactory : abstractfactory

}

首先對以上三種工廠模式做個總結:

最好理解的便是簡單工廠模式,但當需求是增加具體類時,需要增加switch分支,違背了開放-封閉原則,所以建議使用工廠方法模式或抽象工廠模式,但工廠方法模式和抽象工廠模式在建立產品工廠時需要決定例項化什麼型別的工廠,選擇判斷的問題仍然存在,可以理解為只不過是把簡單工廠模式類內部的選擇判斷移到了建立產品工廠時進行選擇判斷

對於以上的不足,使用反射技術可以一併解決(需要引入system.reflection的命名空間),首先利用反射技術進行改寫:

\using system;

using system.reflection;

public class mainclass

}public inte***ce phone

}public class huawei : phone

}public class factory

}

假如需要新增乙個生產手錶的需求,只需在factory類中增加乙個生產watch物件的方法,**如下:

using system;

using system.reflection;

public class mainclass

}public inte***ce phone

public inte***ce watch

public void productionwatch()

}public class huawei : phone, watch

public void productionwatch()

}public class factory

public static watch getwatch()

}

假如不需要生產手錶了,而是新增乙個小公尺的品牌,按照之前的寫法,如果使用簡單工廠模式則需要增加switch分支,如果使用抽象工廠模式則需要新增乙個小公尺工廠類,如下圖所示

但歸根結底不管是什麼品牌的手機,最終都返回phone類物件,某種意義上來說造成了**的重複,如果使用反射技術的話**就簡潔多了,我們只需要修改product欄位即可,**如下: 

using system;

using system.reflection;

public class mainclass

}public inte***ce phone

}public class huawei : phone

}public class xiaomi : phone

}public class factory

}

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

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

設計模式 工廠設計模式

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

設計模式 工廠設計模式

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