模糊查詢js
技術標籤:設計模式javaScript
一、簡單工廠
概念: 簡單工廠模式屬於類的建立型模式,又叫靜態工廠方法模式。通過專門定義一個工廠類來負責建立其他類的例項,被建立的例項通常都具有共同的父類
優點:
- 工廠類包含必要的邏輯判斷,可以決定在什麼時候建立哪一個產品的例項。客戶端可以免除直接建立產品物件的職責,很方便的創建出相應的產品。工廠和產品的職責區分明確。
- 客戶端無需知道所建立具體產品的類名,只需知道引數即可。
- 也可以引入配置檔案,在不修改客戶端程式碼的情況下更換和新增新的具體產品類。
缺點:
- 簡單工廠模式的工廠類單一,負責所有產品的建立,職責過重,一旦異常,整個系統將受影響。且工廠類程式碼會非常臃腫,違背高聚合原則。
- 系統擴充套件困難,一旦增加新產品不得不修改工廠邏輯,在產品型別較多時,可能造成邏輯過於複雜 簡單工廠模式使用了 static工廠方法,造成工廠角色無法形成基於繼承的等級結構。
應用場景
對於產品種類相對較少的情況,考慮使用簡單工廠模式。使用簡單工廠模式的客戶端只需要傳入工廠類的引數,不需要關心如何建立物件的邏輯,可以很方便地建立所需產品。
舉例說明:
現在有個工廠,可以生產美式咖啡,卡布奇諾咖啡,拿鐵咖啡,通過外界的訂單來生產產品。
程式碼實現:
class Coffee{ constructor(name){ console.log(name) } } class AmericanoCoffee extends Coffee{} class CappuccinoCoffee extends Coffee{} class LatteCoffee extends Coffee{} class Factory{ static order(name){ switch(name){ case 'Americano': return new AmericanoFactory('美式咖啡') case 'Cappuccino': return new CappuccinoFactory('卡布奇諾咖啡') case 'Latte': return new LatteFactory('拿鐵咖啡') default: throw new Error('抱歉,沒有你要的咖啡') } } } console.log(Factory.order('Americano'))
二、方法工廠
概念: 工廠方法模式中,核心的工廠類不再負責所以產品的建立,而是將具體的建立工作交給子工廠來做
優點:
- 使用者只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體建立過程。
- 靈活性增強,對於新產品的建立,只需多寫一個相應的工廠類。
- 典型的解耦框架。高層模組只需要知道產品的抽象類,無須關心其他實現類,滿足迪米特法則、依賴倒置原則和里氏替換原則。
缺點:
- 類的個數容易過多,增加複雜度
- 增加了系統的抽象性和理解難度
- 抽象產品只能生產一種產品,此弊端可使用抽象工廠模式解決。
應用場景:
客戶只知道建立產品的工廠名,而不知道具體的產品名。如 TCL 電視工廠、海信電視工廠等。
建立物件的任務由多個具體子工廠中的某一個完成,而抽象工廠只提供建立產品的介面。
舉例說明:
現在有個工廠,裡有美式咖啡工廠,卡布奇諾工廠和拿鐵工廠3個子工廠;3個產品,美式咖啡、卡布奇諾咖啡、拿鐵咖啡;美式工廠建立美式咖啡的例項,卡布奇諾工廠建立卡布奇諾咖啡的例項,拿鐵工廠建立拿鐵咖啡的例項
程式碼實現:
class Coffee{
constructor(name){
console.log(name)
}
}
class AmericanoCoffee extends Coffee{}
class CappuccinoCoffee extends Coffee{}
class LatteCoffee extends Coffee{}
//建立一個咖啡工廠
class CoffeeFactory{}
class AmericanoFactory extends CoffeeFactory{
createCoffee(){
return new AmericanoCoffee('美式咖啡')
}
}
class CappuccinoFactory extends CoffeeFactory{
createCoffee(){
return new CappuccinoCoffee('卡布奇諾咖啡')
}
}
class LatteFactory extends CoffeeFactory{
createCoffee(){
return new LatteCoffee('拿鐵咖啡')
}
}
class Factory{
static order(name){
switch(name){
case 'Americano':
return new AmericanoFactory().createCoffee();
case 'Cappuccino':
return new CappuccinoFactory().createCoffee();
case 'Latte':
return new LatteFactory().createCoffee()
}
}
}
console.log(Factory.order('Cappuccino'))
三、抽象工廠
概念: 抽象工廠可以向客戶提供一個介面,使客戶端再不必指定產品的具體情況霞,建立多個產品中的產品物件
使用抽象工廠模式一般要滿足以下條件。
-
工廠方法模式針對的是同一類或給你個等級產品,而抽象工廠針對的是多種類產品的實際
系統中有多個產品族,每個具體共產負責建立同一族但屬於不同產品等級(產品種類)的產品 -
系統族是一組相關或相互依賴的物件
-
系統一次只能消費某一族產品,即相同產品族的產品一起使用
-
當系統中需要增加一個產品族時,只需要增加工廠類即可,無需改原始碼;但如果需要產品族中增加一個新種類的產品時,則所有的工廠類都需要修改
優點:
- 擁有工廠方法的優點
- 可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理。
- 當需要產品族時,抽象工廠可以保證客戶端始終只使用同一個產品的產品組。
- 抽象工廠增強了程式的可擴充套件性,當增加一個新的產品族時,不需要修改原始碼,滿足開閉原則。
缺點
當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。增加了系統的抽象性和理解難度。
舉例說明:
有三種咖啡,美式,拿鐵,和卡布奇諾。有兩個咖啡店,星巴克和瑞幸,都有這三種產品;但是在星巴克只能買星巴克的美式,拿鐵,和卡布奇諾咖啡;在瑞幸只能買瑞幸的美式,拿鐵,和卡布奇諾咖啡
程式碼實現:
//抽象方法
class AmericanoCoffee{}
class CappuccinoCoffee{}
class LatteCoffee{}
class StarbucksAmericanoCoffee extends AmericanoCoffee{}
class LuckinAmericanoCoffee extends AmericanoCoffee{}
class StarbucksCappuccinoCoffee extends CappuccinoCoffee{}
class LuckinCappuccinoCoffee extends CappuccinoCoffee{}
class StarbucksLatteCoffee extends LatteCoffee{}
class LuckinLatteCoffee extends LatteCoffee{}
class CoffeeFactory{}
class StarbucksCoffeeFactory extends CoffeeFactory{
createAmericanoCoffee(){
return new StarbucksAmericanoCoffee()
}
createCappuccinoCoffee(){
return new StarbucksCappuccinoCoffee()
}
createLatteCoffee(){
return new StarbucksLatteCoffee()
}
}
class LuckinCoffeeFactory extends CoffeeFactory{
createAmericanoCoffee(){
return new LuckinAmericanoCoffee()
}
createCappuccinoCoffee(){
return new LuckinCappuccinoCoffee()
}
createLatteCoffee(){
return new LuckinLatteCoffee()
}
}
console.log(new StarbucksCoffeeFactory().createLatteCoffee())