設計模式的藝術 工廠方法模式

2021-08-27 21:20:30 字數 1968 閱讀 7747

不懂使用為學過,說出用途,繪製結構為了解,不會靈活使用基本等於沒學。

工廠方法模式是簡單工廠模式的延伸,它繼承了簡單工廠方法模式的優點,同時還彌補了簡單工廠方法模式的不足,

工廠方法模式是使用頻率最高的設計模式之一,是很多開源框架api類庫的核心模式

定義乙個使用者建立物件的介面,讓子類決定將哪乙個類例項化,工廠方法模式讓乙個類的例項化延遲到其子類,工廠方法模式又被稱為工廠模式(factory pattern),有可以稱為虛擬構造器模式(virtual constructor pattern)或者多型工廠模式(polymorphic factory pattern)。工廠方法模式是一種類建立型模式

(1)、在工廠方法模式中,工廠方法用來建立客戶所需要的產品,同時還隱藏了那個具體產品類將被例項化這乙個實現細節,使用者只需要關注所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名

(2)、基於工廠角色和產品角色的多型性設計是工廠模式的關鍵,它能讓工廠可以自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠的內部,工廠方法模式又被稱之為多型工廠模式,正是因為所有的具體工廠類都具有同乙個抽象父類

(3)、工廠方法模式最大的優勢在於系統新增產品時,無須修改抽象工廠和抽象產品提供的介面,只需要加上乙個具體產品和對應的工廠即可,這樣子系統的擴充套件性也非常的好,完全符合了開閉原則

(1)、新增產品時,除了編寫新的具體產品類,還需要提供與之相對應的具體工廠類,這樣一定程度上增加了系統的複雜程度,有更多的類需要編譯和執行,會給系統帶來一些額外開銷

(2)、考慮到系統的可擴充套件性,會引入抽象層,在客戶端**中皆使用抽象層定義,會增加系統的抽象性和理解難度,且在實現的時候可能需要用到dom,反射技術,增加了系統的實現難度

(1)、客戶端不需要知道其所需要的物件的類。因為在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需知道對應工廠即可

(2)、抽象工廠通過其子類來確定建立哪個物件,在抽象工廠類中只需要提供乙個建立產品的介面,而尤其子類來確定具體建立的物件,利用物件導向的多型性和黎克特制替換原則,在程式執行時,子類物件覆蓋父類物件,從而使系統更加容易擴充套件

簡單的工廠模式的實現

factory的介面

//工廠類的介面

public inte***ce logge***ctory

factory的具體實現

public class filelogge***ctory implements logge***ctory 

}

public class databaselogge***ctory implements logge***ctory 

}

//輔助工具類,使用xml配置檔案和反射技術增加程式的擴充套件性

public class xmlutil catch (exception e)}}

//所有產品的介面

//抽象產品

public inte***ce logger

//產品的具體實現

public class filelogger implements logger 

}

public class databaselogger implements logger 

}

//配置檔案

<?xml version="1.0" encoding="utf-8" ?>

com.company.factory.filelogge***ctory

//測試類

public class main 

}

設計模式 工廠方法模式

一 工廠方法 factory method 模式 工廠方法模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到工廠子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角...

設計模式 工廠方法模式

1 factorymethod.h ifndef factorymethod h define factorymethod h include include using namespace std class osproduct 產品,product,產品的抽象類 class windowspro...

設計模式 工廠方法模式

框架的基礎知識 對框架的理解 框架和設計模式的關係 工廠方法模式 定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,factory method使乙個類的例項化延遲到其子類。結構 產品 public inte ce product 具體產品 public class productimpl...