设计模式之创建型——工厂模式(3种)
生活随笔
收集整理的這篇文章主要介紹了
设计模式之创建型——工厂模式(3种)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
→23種設計模式大綱
三種工廠模式
- →23種設計模式大綱
- 定義
- 分類
- 1)簡單工廠
- UML類圖
- 2)工廠方法
- UML類圖
- 3)抽象工廠
- UML類圖
- 總結
定義
將創建對象這一復雜的過程交由工廠控制,通過工廠來統一獲取對象。
分類
1)簡單工廠
簡單工廠(靜態工廠)并不屬于GOF中23種設計模式之一,但在實際開發中也用的相對較多。
UML類圖
根據UML類圖可以看出,工廠模塊根據用戶傳入的參數來實例化對應的產品,產品具有抽象的接口。
抽象產品接口和產品類
public interface Product {void function(); }class ProductA implements Product {@Overridepublic void function() {System.out.println("調用 A 產品的功能");} } class ProductB implements Product {@Overridepublic void function() {System.out.println("調用 B 產品的功能");} }工廠類
public class SimpleFactory {public static Product createProduct(String productName){if(productName.equals("A")){return new ProductA();}if(productName.equals("B")){return new ProductB();}throw new RuntimeException("無相關產品");} }調用測試
public class Client {public static void main(String[] args) {Product a = SimpleFactory.createProduct("A");Product b = SimpleFactory.createProduct("B");a.function();b.function();} }總結
- 調用方不用關心產品內部如何構建,只需要調用工廠提供的方法,傳入對應產品名即可獲取對象
- 傳參時可以使用枚舉的方式來匹配
問題
- 新增產品時,需要在工廠內增加 IF 邏輯,不符合開閉原則
- 產品創建時全放在一個工廠內,該工廠承擔職責過重,一旦出錯,所有的產品都會受到影響
2)工廠方法
UML類圖
- 比起簡單工廠,工廠方法進一步抽象了 “工廠” 這一角色。
- 具體實例化的工廠都實現抽象工廠接口。
- 一個實例化工廠負責創建一個產品,一一對應。
產品類
public interface Product {void function(); }class ProductA implements Product {@Overridepublic void function() {System.out.println("調用 A 產品的功能");} }class ProductB implements Product {@Overridepublic void function() {System.out.println("調用 B 產品的功能");} }工廠類
public interface AbstractFactory {public Product createProduct(); } //工廠A負責創建產品A class FactoryA implements AbstractFactory{@Overridepublic Product createProduct() {return new ProductA();} } //工廠B負責創建產品B class FactoryB implements AbstractFactory{@Overridepublic Product createProduct() {return new ProductB();} }優點:
新增產品后,不需要像簡單工廠一樣再重新修改原因邏輯。新增一個新的工廠專門去負責創建新的產品即可。
缺點:
如果產品數量過多,那么就會產生很多的工廠類,工廠類太多自然也是個問題。
3)抽象工廠
新概念→產品族:將各種相關的產品組合在一起的集合。為了解決工廠類太多的問題,我們可以讓一個工廠去生產對應的產品族。
從 1對1(工廠方法),變為1對N(抽象工廠)。
舉個例子:
- 蘋果手機,蘋果筆記本,蘋果臺式電腦是一個產品族。蘋果廠商負責生產這個產品族。
- 小米手機,小米筆記本,小米臺式電腦是一個產品族。小米廠商負責生產這個產品族。
UML類圖
工廠
產品
public interface Pen {void function(); } interface Book {void function(); } interface Bag {void function(); } class Apen implements Pen {@Overridepublic void function() {System.out.println(" A 廠 Pen");} } class Abook implements Book {@Overridepublic void function() {System.out.println(" A 廠 Book");} } class Abag implements Bag {@Overridepublic void function() {System.out.println(" A 廠 Bag");} } class Bpen implements Pen {@Overridepublic void function() {System.out.println(" B 廠 Pen");} } class Bbook implements Book {@Overridepublic void function() {System.out.println(" B 廠 Book");} } class Bbag implements Bag {@Overridepublic void function() {System.out.println(" B 廠 Bag");} }引入產品族的概念確實一定程度上的解決了工廠類的問題。
對于產品族而言,如果再增加又有新的廠商加入,那么再增加一個工廠即可。
注意點:
- 對于產品族的橫向擴展,抽象工廠遵守了 “開閉原則”。(增加新的工廠)
- 但對于產品族的縱向擴展,即如果產品族內需要新增一種產品,則會面臨大幅度的修改。
所以抽象工廠使用時,需要能夠盡量全面的預估一個產品族需要包含的產品。
總結
總結
以上是生活随笔為你收集整理的设计模式之创建型——工厂模式(3种)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: umap算法_科学网-[转载]【源码】均
- 下一篇: Hive3.1.2安装指南