1. 程式人生 > 其它 >嘿,李四,你來負責分揀土豆任務(簡單工廠)

嘿,李四,你來負責分揀土豆任務(簡單工廠)

技術標籤:Javajava

文章目錄


前言

由於業務需要,普通的人工分類已經滿足不了分揀需求,此時,一把手開了一個會議,提議將分揀模式升級一下,採用定向分類來進行人工分揀或機器分揀,李四,你來負責。
李四回答:好勒,老闆!


一、理一理簡單工廠思維

被操作的物件成為 “產品”,進行產品操作的物件稱作 “工廠”,產品不多,只需要造一個小型工廠(簡單工廠或靜態工廠)就可以完成這個操作,此時的工廠或又可以成為小作坊。確定了目標大小之後,李四開始召集人手開始打造工廠。

二、開始確定工廠結構

土豆土豆

/**
 * 土豆
 * @author Penglei
 * @date  2020/12/26
 * @version 1.0.0
 * @updateVersion 1.0.0
 */
public interface Tomato {
    /*土豆資訊*/
    void tInfo();
}

/**
 * 大土豆
 * @author Penglei(紅蜘蛛)
 * @date  2020/12/26
 * @version 1.0.0
 * @updateVersion 1.0.0
 */
public class BigTomato implements Tomato{
    @Override
public void tInfo() { System.out.println("我是大土豆"); } } /** * 中等土豆 * @author Penglei(紅蜘蛛) * @date 2020/12/26 * @version 1.0.0 * @updateVersion 1.0.0 */ public class InTomato implements Tomato{ @Override public void tInfo() { System.out.println("我是中等級別土豆"
); } } /** * 小土豆 * @author Penglei(紅蜘蛛) * @date 2020/12/26 * @version 1.0.0 * @updateVersion 1.0.0 */ public class SmallTomato implements Tomato{ @Override public void tInfo() { System.out.println("我是小土豆"); } }

簡單工廠(第一種用法)

/**
 * 簡單工廠介面
 * @author Penglei(紅蜘蛛)
 * @date  2020/12/26
 * @version 1.0.0
 * @updateVersion 1.0.0
 */
public class SimpleFactory {
    public static final int BIG = 1;
    public static final int IN = 2;
    public static final int SMALL = 3;


    /**
    * 土豆大小
    * @author Penglei(紅蜘蛛)
    * @date 2020/12/26
    * @version 1.0.0
    * @updateVersion 1.0.0
    * @param _type : 土豆型別
    * @return Tomato
    */
    public static Tomato getInfo(int _type){
        switch (_type){
            case BIG:
                return new BigTomato();
            case IN:
                return new InTomato();
            case SMALL:
                return new SmallTomato();
            default:
                return new SmallTomato();
        }
    }


    public static void main(String[] args) {
        Tomato tomato = SimpleFactory.getInfo(SimpleFactory.IN);
        tomato.tInfo();
    }
}

在這裡插入圖片描述

場景應用

對於產品種類相對較少的情況,使用簡單工廠模式。使用簡單工廠模式的客戶端只需要傳入工廠類的引數,不需要關心如何建立物件的邏輯,可以很方便地建立所需產品。

簡單工廠(另一種玩法)

封裝土豆,規定土豆分類種類

/**
 * 土豆分類專欄
 * @author Penglei(紅蜘蛛)
 * @date  2020/12/26
 * @version 1.0.0
 * @updateVersion 1.0.0
 */
public enum TomatoEnum {
    BIG(1,new BigTomato()),
    IN(2,new InTomato()),
    SMALL(3,new SmallTomato()),
    ;


    /*土豆大小*/
    private int _type;
    /*土豆土豆*/
    private Tomato tomato;

    TomatoEnum(int _type, Tomato tomato) {
        this._type = _type;
        this.tomato = tomato;
    }
    
    public static Tomato getTomato(int _type){
        TomatoEnum[] tomatoEnums = TomatoEnum.values();
        for (TomatoEnum tomatoEnum : tomatoEnums) {
            if(tomatoEnum._type == _type){
                return tomatoEnum.tomato;
            }
        }
        return TomatoEnum.SMALL.tomato;
    }
}

/**
 * 簡單工廠介面
 * @author Penglei(紅蜘蛛)
 * @date  2020/12/26
 * @version 1.0.0
 * @updateVersion 1.0.0
 */
public class SimpleFactory {
    public static final int BIG = 1;
    public static final int IN = 2;
    public static final int SMALL = 3;


    /**
    * 土豆大小
    * @author Penglei(紅蜘蛛)
    * @date 2020/12/26
    * @version 1.0.0
    * @updateVersion 1.0.0
    * @param _type : 土豆型別
    * @return Tomato
    */
    public static Tomato getInfo(int _type){
    	//此處程式碼是不是看起來更簡潔了呢
        return TomatoEnum.getTomato(_type);
    }


    public static void main(String[] args) {
        Tomato tomato = SimpleFactory.getInfo(SimpleFactory.SMALL);
        tomato.tInfo();
    }
}

在這裡插入圖片描述

反射方式(相對標準方式)

public class TomatoFactory {
    public static <T extends Tomato> T createTomato(Class<T> t) {
        Tomato tomato = null;
        try {
            tomato = (Tomato) Class.forName(t.getName()).newInstance();
        } catch (InstantiationException
                |ClassNotFoundException
        |IllegalAccessException e) {
            System.out.println("分揀錯誤......");
        }
        return (T)tomato;
    }

	//方便測試,直接在工廠內部用main測試
    public static void main(String[] args) {
        InTomato tomato = TomatoFactory.createTomato(InTomato.class);
        tomato.tInfo();
    }
}

到這裡李四圓滿完成了老闆分配的任務,被老闆狠狠的稱讚了一番,當然老闆也因為土豆分揀合適狠狠賺了一番。