1. 程式人生 > 實用技巧 >codeforces 676C - Vasya and String (尺取法)

codeforces 676C - Vasya and String (尺取法)

設計模式之簡單工廠模式

本篇部落格參考以下文章:

工廠模式--簡單工廠模式

基本介紹

  • 簡單工廠模式屬於建立型模式,是工廠模式的一種,簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項,簡單工廠模式是工廠模式家族中最簡單實用的模式
  • 簡單工廠模式:定義了一個建立物件的類,由這個類來封裝例項化物件的行為(程式碼)
  • 在軟體開發中,當我們會用到大量的建立某種、某類或某批物件時,就會用到工廠模式

使用簡單工廠模式

1.看一個簡單的需求

看一個披薩的專案:要便於披薩種類的擴充套件,要便於維護

  1. 披薩的種類很多(比如greekPizz、CheesePizza等)
  2. 披薩的製作有prepare、bake、cut、box
  3. 完成披薩店的訂購功能

2.繪製UML類圖

  • Factory:工廠類,簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類的建立產品類的方法可以被外界直接呼叫,建立所需的產品物件。
  • IProduct:抽象產品類,簡單工廠模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。
  • Product:具體產品類,是簡單工廠模式的建立目標。

3.編寫程式碼

抽象類Pizza以及實現Pizza的三個子類

/**
 * @author gaoteng
 * 將Pizza類做成抽象
 */
public abstract class Pizza {
    /**
     * 名字
     */
    protected String name;
    /**
     *準備原材料, 不同的披薩不一樣,因此,我們做成抽象方法
     */
    public abstract void prepare();
    /**
     * 烘烤
     */
    public void bake() {
        System.out.println(name + " baking;");
    }

    /**
     * 切片
     */
    public void cut() {
        System.out.println(name + " cutting;");
    }
    /**
     * 打包
     */
    public void box() {
        System.out.println(name + " boxing;");
    }

    public void setName(String name) {
        this.name = name;
    }
}


/**
 * @author gaoteng
 * 乳酪披薩
 */
public class CheesePizza extends Pizza {
    @Override
    public void prepare(){
        System.out.println("給製作乳酪披薩,製作原料!");
    }
}


/**
 * @author gaoteng
 * 希臘披薩
 */
public class GreekPizza extends Pizza {

    @Override
    public void prepare() {
        System.out.println("給希臘披薩準備原材料");
    }
}


/**
 * @author gaoteng
 * 胡椒披薩
 */
public class PepperPizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("給胡椒披薩準備原材料");
    }
}

簡單工廠類

/**
 * @author gaoteng
 * 簡單工廠類
 */
public class SimpleFactory {
    //簡單工廠模式 也叫 靜態工廠模式
    public static Pizza createPizza(String orderType) {

        Pizza pizza = null;

        System.out.println("使用簡單工廠模式");
        if (orderType.equals("greek")) {
            pizza = new GreekPizza();
            pizza.setName(" 希臘披薩 ");
        } else if (orderType.equals("cheese")) {
            pizza = new CheesePizza();
            pizza.setName(" 乳酪披薩 ");
        } else if (orderType.equals("pepper")) {
            pizza = new PepperPizza();
            pizza.setName("胡椒披薩");
        }

        return pizza;
    }
}

4.客戶端測試

/**
 * @author gaoteng
 * 訂單披薩類
 */
public class OrderPizza {
    public static void main(String[] args) {
        Pizza cheese = SimpleFactory.createPizza("cheese");
        System.out.println(cheese.name);
    }
}

5.優缺點以及應用場景

優點:

  • 工廠類含有必要的判斷邏輯,可以決定在什麼時候建立哪一個產品類的例項,客戶端可以免除直接建立產品物件的責任,而僅僅“消費”產品;簡單工廠模式通過這種做法實現了對責任的分割,它提供了專門的工廠類用於建立物件
  • 客戶端無須知道所建立的具體產品類的類名,只需要知道具體產品類所對應的引數即可,對於一些複雜的類名,通過簡單工廠模式可以減少使用者的記憶量。
  • 通過引入配置檔案,可以在不修改任何客戶端程式碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。

缺點:

  • 由於工廠類集中了所有產品建立邏輯,一旦不能正常工作,整個系統都要受到影響。
  • 使用簡單工廠模式將會增加系統中類的個數,在一定程式上增加了系統的複雜度和理解難度。
  • 系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯,同樣破壞了“開閉原則”;在產品型別較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴充套件和維護

適用環境:

  • 工廠類負責建立的物件比較少:由於建立的物件較少,不會造成工廠方法中的業務邏輯太過複雜。
  • 客戶端只知道傳入工廠類的引數,對於如何建立物件不關心:客戶端既不需要關心建立細節,甚至連類名都不需要記住,只需要知道型別所對應的引數