【正文】
把茶倒入杯子 4) 加檸檬 沖泡咖啡 沖泡茶葉 52 咖啡類 public class Coffe{ void prepareRecipe(){ boilWater()。 return uniqueInstance。 } } 48 單件模式 public class Singleton{ private static Singleton uniqueInstance。 } 匹薩店的 createPizza方法 依賴所有具體的匹薩類的實(shí)現(xiàn) 任何具體匹薩的改變都會(huì)影響 到匹薩店 43 依賴倒置原則 ?要依賴抽象,不要依賴具體類 ? 不能讓高層組件依賴低層組件,兩者都應(yīng)該依賴抽象 ? PizzaStore是高層組件 ? 匹薩的實(shí)現(xiàn)是低層組件, PizzaStore依賴了具體匹薩 ? 修改代碼:依賴抽象 44 依賴倒置 45 內(nèi)容安排 ?設(shè)計(jì)模式舉例 ? 策略模式 ? 適配器模式 ? 工廠模式 ? 單件模式 ? 模板方法模式 46 循序漸進(jìn)推導(dǎo)單件模式 ?如何創(chuàng)建一個(gè)對(duì)象 ? new MyClass()。 ()。 else if((“clam”)) pizza = new NYStyleClamPizza()。工廠方法讓類把實(shí)例化推遲到子類 ? “工廠方法讓子類決定要實(shí)例化的類”,不是指子類本身存在決定的邏輯,而是根據(jù)用戶選擇的工廠類型,從而決定了創(chuàng)建的產(chǎn)品類型 42 不用工廠方法 ?若不使用工廠方法,則對(duì)匹薩店 PizzaStore的依賴很強(qiáng) public Pizza createPizza(String style, String type){ Pizza pizza = null。 } else return null。 } 這些不許變化 每個(gè)匹薩店子類必須實(shí)現(xiàn)自己的匹薩創(chuàng)建, 但匹薩的制作、包裝過(guò)程嚴(yán)格受控 38 允許子類做決定 ?PizzStore有成熟的訂購(gòu)系統(tǒng),由 orderPizza處理 ? 保證所有加盟店的訂單處理一致 ? 每個(gè) PizzaStore的子類必須重新實(shí)現(xiàn) createPizza,實(shí)現(xiàn)不同風(fēng)味的匹薩 P i z z aS t o r e+ o r d e r P iz z a ( ty p e : S tr in g )+ c r e a te P iz z a ( )N Y P i z z aS t o r e+ c r e a te P iz z a ( )Ch i c ag o P i z z aS t o r e+ c r e a te P iz z a ( )39 開一家匹薩店 public class NYPizzaStore extends PizzaStore{ Pizza createPizza(String type){ if((“cheese”)){ return new NYStyleCheesePizza()。 return pizza。 ()。 ()。 不同的工廠,除了改變風(fēng)味外,可能也會(huì)改變制作流程! 37 給匹薩店設(shè)置框架 public abstract class PizzaStore{ public Pizza orderPizza(String type){ Pizza pizza。 PizzaStore nyStore=new PizzaStroe(nyFactory)。 return pizza。 ()。 ()。 } public Pizza orderPizza(String type){ Pizza pizza。 } } 封裝創(chuàng)建匹薩的過(guò)程,變化時(shí)只需要修改該簡(jiǎn)單工廠 34 重整匹薩店 PizzaStore public class PizzaStore{ SimplePizzaFactory factory。 else if((“clam”)) pizza = new CalmPizza()。 if((“cheese”) pizza = new CheesePizza()。 else if((“clam”)) pizza = new CalmPizza()。 } if((“cheese”) pizza = new CheesePizza()。 ()。 ()。 } 這是不變部分 這是變化部分 無(wú)法對(duì)修改關(guān)閉! 32 抽取創(chuàng)建匹薩的代碼 Pizza orderPizza(String type){ Pizza pizza。 ()。 ()。 else if((“clam”)) pizza = new CalmPizza()。 if((“cheese”) pizza = new CheesePizza()。 return pizza。 ()。 else if(.......) ()。 if((“cheese”) pizza = new CheesePizza()。 return pizza。 ()。 ()。 else if(hunting) duck = new Deco