1. 程式人生 > 其它 >模糊查詢js

模糊查詢js

技術標籤:設計模式javaScript

一、簡單工廠

概念: 簡單工廠模式屬於類的建立型模式,又叫靜態工廠方法模式。通過專門定義一個工廠類來負責建立其他類的例項,被建立的例項通常都具有共同的父類

優點:

  1. 工廠類包含必要的邏輯判斷,可以決定在什麼時候建立哪一個產品的例項。客戶端可以免除直接建立產品物件的職責,很方便的創建出相應的產品。工廠和產品的職責區分明確。
  2. 客戶端無需知道所建立具體產品的類名,只需知道引數即可。
  3. 也可以引入配置檔案,在不修改客戶端程式碼的情況下更換和新增新的具體產品類。

缺點:

  1. 簡單工廠模式的工廠類單一,負責所有產品的建立,職責過重,一旦異常,整個系統將受影響。且工廠類程式碼會非常臃腫,違背高聚合原則。
    使用簡單工廠模式會增加系統中類的個數(引入新的工廠類),增加系統的複雜度和理解難度
  2. 系統擴充套件困難,一旦增加新產品不得不修改工廠邏輯,在產品型別較多時,可能造成邏輯過於複雜 簡單工廠模式使用了 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'))

二、方法工廠

概念: 工廠方法模式中,核心的工廠類不再負責所以產品的建立,而是將具體的建立工作交給子工廠來做

優點:

  1. 使用者只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體建立過程。
  2. 靈活性增強,對於新產品的建立,只需多寫一個相應的工廠類。
  3. 典型的解耦框架。高層模組只需要知道產品的抽象類,無須關心其他實現類,滿足迪米特法則、依賴倒置原則和里氏替換原則。

缺點:

  1. 類的個數容易過多,增加複雜度
  2. 增加了系統的抽象性和理解難度
  3. 抽象產品只能生產一種產品,此弊端可使用抽象工廠模式解決。

應用場景:

客戶只知道建立產品的工廠名,而不知道具體的產品名。如 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'))

三、抽象工廠

概念: 抽象工廠可以向客戶提供一個介面,使客戶端再不必指定產品的具體情況霞,建立多個產品中的產品物件

使用抽象工廠模式一般要滿足以下條件。

  • 工廠方法模式針對的是同一類或給你個等級產品,而抽象工廠針對的是多種類產品的實際
    系統中有多個產品族,每個具體共產負責建立同一族但屬於不同產品等級(產品種類)的產品

  • 系統族是一組相關或相互依賴的物件

  • 系統一次只能消費某一族產品,即相同產品族的產品一起使用

  • 當系統中需要增加一個產品族時,只需要增加工廠類即可,無需改原始碼;但如果需要產品族中增加一個新種類的產品時,則所有的工廠類都需要修改

優點:

  1. 擁有工廠方法的優點
  2. 可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理。
  3. 當需要產品族時,抽象工廠可以保證客戶端始終只使用同一個產品的產品組。
  4. 抽象工廠增強了程式的可擴充套件性,當增加一個新的產品族時,不需要修改原始碼,滿足開閉原則。

缺點

當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。增加了系統的抽象性和理解難度。

舉例說明:

有三種咖啡,美式,拿鐵,和卡布奇諾。有兩個咖啡店,星巴克和瑞幸,都有這三種產品;但是在星巴克只能買星巴克的美式,拿鐵,和卡布奇諾咖啡;在瑞幸只能買瑞幸的美式,拿鐵,和卡布奇諾咖啡

程式碼實現:

//抽象方法
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())