定義:通過定義乙個用於建立物件的介面,讓子類決定例項化哪個類
需要生成複雜物件的地方,可以使用工廠模式,如果只用new就可以完成建立的物件無需使用工廠模式
四大模組:抽象工廠類、具體工廠類、抽象產品、具體產品。需要哪乙個產品就去生產哪乙個產品
其實比較簡單吧,工廠模式有比較好的擴充套件性
public abstract class product
public class producta extends product
}public class productb extends product
}public abstract class factory
public class factorya extends factory
}public class factoryb extends factory
}// 呼叫
factory factorya = new factorya();
product producta = factory.createproduct();
producta.method();
factory factoryb = new factoryb();
product productb = factory.createproduct();
producta.method();
如果採用反射寫更加簡單:
public abstract class factory
class factoryimpl extends factory catch (exception e)
return (t) product;
}}// 呼叫
factory factory = new factoryimpl();
product product = factory.createproduct(product.class);
product.method();
如果我們確定工廠類只有乙個,我們就可以將抽象簡化掉,直接用靜態方法就可以
乙個產品基類,若干產品類繼承這個基類,乙個工廠類靜態方法根據傳入的不同引數來生產產品,也算達到工廠模式的乙個基本功能,將例項化物件的操作封裝起來,這裡我是直接想到迪公尺特原則,最少知道原則,呼叫者只是想要乙個物件例項,而不想關心它是如何建立的。其實在android開發中遇到的問題大多也就是簡單工廠就能解決了的
public abstract class product
public class producta extends product
public class productb extends product
public class productc extends product
public class factory
}}// main方法中呼叫
product product = factory.createproduct("a");
product.method();
對於android呢,其實activity的oncreate()方法可以看作是乙個工廠方法模式的create()方法,oncreate()方法中的setcontentview()相當於構造了乙個view
工廠方法模式是乙個具有可擴充套件性的設計模式,但是新增越來越多的產品,會導致類的結構複雜化,我們應該酌情考慮是否需要使用工廠方法模式
其實一開始看了一些書籍還沒弄明白抽象工廠和工廠方法有什麼區別,還特別納悶,不都是那個意思嗎?其實多讀幾遍就明白了,它們的區別在於:乙個和一組
工廠方法模式:市裡面有生產汽車的工廠,我們想引進一種新的汽車,那麼需要找到新的車企工廠來生產,就需要新增乙個汽車類和乙個工廠類了,它們分別去繼承它們的抽象類,而且每個工廠只能生產自家的汽車產品,所以我們只有乙個抽象產品類
抽象工廠模式:其實相當於是把工廠方法模式又抽了一層出來,細分了一級,要生產一組東西的,那比如說市裡面的中餐館都在賣熱菜類、冷盤類、主食類,但是每個餐館對乙個的類別的菜譜不同,這就相當於乙個工廠可以產三個產品了,我們會有三個抽象產品類
假設我們現在有餐廳a,餐廳b,而它們有熱菜、冷盤、主食,我們來練習乙個抽象工廠:
abstract class hotmenu
abstract class coldmenu
abstract class mainmenu
class hotmenua extends hotmenu
}class hotmenub extends hotmenu
}class coldmenua extends coldmenu
}class coldmenub extends coldmenu
}class mainmenua extends mainmenu
}class mainmenub extends mainmenu
}abstract class restaurant
class restauranta extends restaurant
@override
coldmenu createcoldmenu()
@override
mainmenu createmainmenu()
}class restaurantb extends restaurant
@override
coldmenu createcoldmenu()
@override
mainmenu createmainmenu()
}// 呼叫
restaurant restauranta = new restauranta();
restauranta.createhotmenu().method();
restauranta.createcoldmenu().method();
restauranta.createmainmenu().method();
restaurant restaurantb = new restaurantb();
restaurantb.createhotmenu().method();
restaurantb.createcoldmenu().method();
restaurantb.createmainmenu().method();
想要理解抽象工廠模式,其實最關鍵的一點就是明確有多個抽象產品,乙個工廠可以生產多個不同型別的產品
抽象工廠分離了介面和實現,但是抽象工廠需要管理更加多的類,一旦增加新的工廠,就需要新增若干個產品類;如果增加新的產品,必須修改抽象工廠,而且所有的具體工廠都要修改
總結
關於工廠模式,一開始其實挺不好理解的,也搞不懂到底會應用在什麼地方。其實隨著工作經驗的增加,對於這些東西慢慢的也就理解了。
android對於工廠方法的應用不是很多,抽象工廠基本就更少了,常見的就是說activity的oncreate()方法中setcontentview()返回乙個view物件,service中onbind返回乙個binder物件。先到這裡,過段時間再回來。
設計模式 工廠方法模式
一 工廠方法 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...