嘿,李四,你來負責分揀土豆任務(簡單工廠)
阿新 • • 發佈:2020-12-27
文章目錄
前言
由於業務需要,普通的人工分類已經滿足不了分揀需求,此時,一把手開了一個會議,提議將分揀模式升級一下,採用定向分類來進行人工分揀或機器分揀,李四,你來負責。
李四回答:好勒,老闆!
一、理一理簡單工廠思維
被操作的物件成為 “產品”,進行產品操作的物件稱作 “工廠”,產品不多,只需要造一個小型工廠(簡單工廠或靜態工廠)就可以完成這個操作,此時的工廠或又可以成為小作坊。確定了目標大小之後,李四開始召集人手開始打造工廠。
二、開始確定工廠結構
土豆土豆
/**
* 土豆
* @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();
}
}
到這裡李四圓滿完成了老闆分配的任務,被老闆狠狠的稱讚了一番,當然老闆也因為土豆分揀合適狠狠賺了一番。