深入淺出工廠設計模式

2021-07-28 08:11:57 字數 3177 閱讀 3667

本文出自方志朋的部落格

##工廠設計模式

###一.什麼是工廠設計模式

工廠模式是我們最常用的例項化物件模式了,是用工廠方法代替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 語句就長的可怕,修改與維護更令人頭疼。披薩子類繼承實現相同的基類,通過基類呼叫不同的子類,使得 具有一定的彈性,將構造子類放入業務 導致了子類與業務 的耦合,令...