設計模式(二)——Java簡單工廠模式


簡單工廠模式

案例:

披薩的項目(要便於披薩種類的擴展,要便於維護)

1)披薩的種類很多(比如 GreekPizz、CheesePizz 等)
2)披薩的制作有 prepare,bake, cut, box
3)完成披薩店訂購功能。

使用傳統的方式來完成

 

 

 

編寫 OrderPizza.java 去訂購需要的各種 Pizza

Pizza類

package com.lin.simplefactory;

public class SimpleFactoryDemo {

}

abstract class Pizza{
    
    private String name;

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

    public void prepare() {
        System.out.println(name + " are prepared!");
    }
    
    public void bake() {
        System.out.println(name + " are baked!");
    }
    
    public void cut() {
        System.out.println(name + " are cutted!");
    }
    
    public void box() {
        System.out.println(name + " are boxed!");
    }
    
}

// chesspizza
class ChessPizza extends Pizza{

}

// greekpizza
class GreekPizza extends Pizza{
    
}

// chinapizza
class ChinaPizza extends Pizza{
    
}

OrderPizza類

package com.lin.simplefactory;


import java.util.Scanner;
/**
 *     假如有很多orderpizza,如果增加一種pizza種類,修改就很麻煩,效率低
 * @Description: 
 * @author LinZM  
 * @date 2021-2-3 0:29:26 
 * @version V1.8
 */
public class OrderPizza {
    
    public OrderPizza(){
        Pizza pizza = null;
        String orderType;
        while(true) {
            orderType = getType();
            if(orderType.equals("chess")) {
                pizza = new ChessPizza();
                pizza.setName("chesspizza");
            } else if(orderType.equals("greek")) {
                pizza = new GreekPizza();
                pizza.setName("greekpizza");
            } else if(orderType.equals("china")) {
                pizza = new ChinaPizza();
                pizza.setName("chinapizza");
            } else {
                break;
            }
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }public String getType() {
       
        Scanner str = new Scanner(System.in);
        System.out.println("please input the type of ordered pizza:");
        String type = str.next();
        return type;
    }
}

PizzaStore類

package com.lin.simplefactory;

public class PizzaStore {

    public static void main(String[] args) {
        new OrderPizza();
    }
}

 傳統的方式的優缺點

1)優點是比較好理解,簡單易操作。
2)缺點是違反了設計模式的 ocp 原則,即對擴展開放,對修改關閉。即當我們給類增加新功能的時候,盡量不修改代碼,或者盡可能少修改代碼.
3)比如我們這時要新增加一個 Pizza 的種類(Pepper 披薩),我們需要做如下修改. 如果我們增加一個 Pizza 類,只要是訂購 Pizza 的代碼都需要修改.

改進的思路分析

分析:修改代碼可以接受,但是如果我們在其它的地方也有創建 Pizza 的代碼,就意味着,也需要修改,而創建 Pizza

的代碼,往往有多處。

思路:把創建 Pizza 對象封裝到一個類中,這樣我們有新的 Pizza 種類時,只需要修改該類就可,其它有創建到 Pizza

對象的代碼就不需要修改了.-> 簡單工廠模式

基本介紹

1) 簡單工廠模式是屬於創建型模式,是工廠模式的一種。簡單工廠模式是由一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式。

2) 簡單工廠模式:定義了一個創建對象的類,由這個類來封裝實例化對象的行為(代碼)。

3) 在軟件開發中,當我們會用到大量的創建某種、某類或者某批對象時,就會使用到工廠模式。

使用簡單工廠模式

簡單工廠模式的設計方案: 定義一個可以實例化 Pizaa 對象的類,封裝創建對象的代碼。

 

 

 Pizza類不變

OrderPizza類

package com.lin.simplefactory;


import java.util.Scanner;
/**
 *     假如有很多orderpizza,如果增加一種pizza種類,修改就很麻煩,效率低
 * @Description: 
 * @author LinZM  
 * @date 2021-2-3 0:29:26 
 * @version V1.8
 */
public class OrderPizza {
    
        //定義一個工廠對象
        public SimpleFactory factory = null;
        public Pizza pizza = null;

        // 構造器
        public OrderPizza(SimpleFactory factory) {
            setFactory(factory);
        }
        public void setFactory(SimpleFactory factory) {
            String type = "";
            this.factory = factory;
            while(true) {
                type = getType();
                pizza = this.factory.createPizza(type);
                
                if(pizza != null) {
                    pizza.prepare();
                    pizza.bake();
                    pizza.cut();
                    pizza.box();
                } else {
                    System.out.println("沒有這種披薩!");
                    break;
                }
            }
        }


    public String getType() {
       
        Scanner str = new Scanner(System.in);
        System.out.println("please input the type of ordered pizza:");
        String type = str.next();
        return type;
    }
}

增加一個類--SimpleFatcory類

package com.lin.simplefactory;
/**
 *     簡單工廠模式
 * @Description: 
 * @author LinZM  
 * @date 2021-2-3 0:28:04 
 * @version V1.8
 */
public class SimpleFactory {

    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        
        System.out.println("使用簡單工廠模式");
        if(orderType.equals("chess")) {
            pizza = new ChessPizza();
            pizza.setName("chesspizza");
        } else if(orderType.equals("greek")) {
            pizza = new GreekPizza();
            pizza.setName("greekpizza");
        } else if(orderType.equals("china")) {
            pizza = new ChinaPizza();
            pizza.setName("chinapizza");
        } 
        return pizza;
    }
}

PizzaStore類

package com.lin.simplefactory;

public class PizzaStore {

    public static void main(String[] args) {
//        new OrderPizza();
        new OrderPizza(new SimpleFactory());
    }
}

同時,簡單工廠模式又叫靜態工廠模式,在OrderPizza類中將creatPizza改為static,在后面使用類.方法名方式調用該方法。

 

僅供參考,有錯誤還請指出!

有什么想法,評論區留言,互相指教指教。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM