本文出自方志朋的部落格
##工廠設計模式
###一.什麼是工廠設計模式
工廠模式是我們最常用的例項化物件模式了,是用工廠方法代替new操作的一種模式。因為工廠模式就相當於建立例項物件的new,雖然這樣做,可能多做一些工作,但會給你系統帶來更大的可擴充套件性和盡量少的修改量。工廠模式最直接的作用就是將建立物件和物件的業務邏輯相分離。工廠模式最常見的三種:
以下是我看《headefirst設計模式》的工廠模式的筆記。非常有意思,但是篇幅有點長,所以打算總結下,寫個簡潔版的。
假如你有個pizza店,你可以為客人做很多 pizza。
首先,你需要很多pizza物件,定義乙個pizza抽象類:
public abstract class pizza
中式 pizza:
public class chineasepizza extends pizza
@override
public void bake()
@override
public void cut()
@override
public void box()
}
美式pizza:
public class americanpizza extends pizza
@override
public void bake()
@override
public void cut()
@override
public void box()
}
當我需要為客人準備乙份pizza,我們可能會需要這樣寫:
public pizza orderpizza(string type)else if(type.equals("a"))else if(type.equals("e"))else
pizza.prepared();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
當你有很多種pizza的時候,這個else if()特別的長:
if(type.equals("c"))else if(type.equals("a"))else if(type.equals("e"))else if(...)else
你需要建立乙個工廠來管理這些pizza的建立例項:
public class ******pizzafactory else if(type.equals("a"))else if(type.equals("e"))else
return pizza;
}}
有了工廠之後的你**應該這樣寫:
public class pizzastore
public pizza orderpizza(string type)
}
就是簡單的工廠模式,工廠處理建立物件的細節。工廠模式將建立物件和物件的業務邏輯相分離,降低了**的耦合性,提高了**的可讀性。
當你需要開很多pizza店的時候,你可能需要建立的pizztore抽象類,這個抽象類只專注於賣pizza的業務邏輯,不專注pizza是怎麼來的:
public abstract class apizzastore
abstract pizza createpizza(string type);
}
它的子類需要專注於pizza 是怎麼來的,你需要在北京開一家pizza店:
public class beijingtpizzastore extends apizzastoreelse
return pizza;
}}
你在北京賣pizza之需要:
beijingtpizzastore bps=new beijingtpizzastore();
bps.orderpizza();
同理,你需要在深圳開pizza店:
public class shenzhengpizzastore extends apizzastore
}
工廠方法用來處理物件的建立,並將這樣的行為封裝在子類中。超類的**和子類的物件建立**就解耦了。
你製造pizza的時候,需要很多原料,這時需要乙個工廠來製造:
public inte***ce ingredientfactory
建立乙個中國原料工廠:
public class chineaseingredientfactory implements ingredientfactory
@override
public sauce createsauch()
@override
public cheese createcheese()
}
同理也可以建立美國原料工廠:
這時我們可以重做pizza:
public abstract class pizza
中國式pizza:
public class chineasepizza extends pizza
@override
public void prepared()
@override
public void bake()
@override
public void cut()
@override
public void box()
}
這時候我們再看,利用抽象工廠模式,可以為pizza建立原料,pizza只關注於它自身的業務邏輯,而不用關注pizza原料從**來,這樣的pizza和pizza原料的解耦。
通過抽象工廠所提供的介面,可以建立產品的家族,利用這個介面寫**,我們的**將實際工廠解耦,以便在不同的工廠,製造出不同的產品。
C 深入淺出工廠模式(高階篇)
前文初始篇c 深入淺出工廠模式 初始篇 主要闡述了簡單工廠模式 工廠方法模式和抽象工廠模式的結構 特點和缺陷等。以上三種方式,在新增產品時,要麼修改工廠類,要麼需新增具體的工廠類,說明工廠類的封裝性還不夠好。本文高階篇,主要是將工廠類的封裝性提高,達到新增產品時,也不需要修改工廠類,不需要新增具體的...
C 深入淺出工廠模式(高階篇)
前文初始篇c 深入淺出工廠模式 初始篇 主要闡述了簡單工廠模式 工廠方法模式和抽象工廠模式的結構 特點和缺陷等。以上三種方式,在新增產品時,要麼修改工廠類,要麼需新增具體的工廠類,說明工廠類的封裝性還不夠好。本文高階篇,主要是將工廠類的封裝性提高,達到新增產品時,也不需要修改工廠類,不需要新增具體的...
深入淺出設計模式 工廠模式
披薩店新推出了點單系統,披薩需要通過不同的製作,相同的烘焙,裁剪等工序才能完成。披薩的種類實在太多了,在構造披薩例項時,光是if else 語句就長的可怕,修改與維護更令人頭疼。披薩子類繼承實現相同的基類,通過基類呼叫不同的子類,使得 具有一定的彈性,將構造子類放入業務 導致了子類與業務 的耦合,令...