在軟件工程中,設(shè)計(jì)模式是解決常見問題的可復(fù)用方案。而在賽事策劃這一充滿組織與協(xié)調(diào)的領(lǐng)域,其背后的邏輯與軟件設(shè)計(jì)模式有著異曲同工之妙。本文將以賽事策劃為類比,深入淺出地解析Java中三種經(jīng)典的創(chuàng)建型模式:簡(jiǎn)單工廠模式、工廠方法模式和抽象工廠模式。
第一部分:簡(jiǎn)單工廠模式 —— 標(biāo)準(zhǔn)賽事套餐
模式定義:簡(jiǎn)單工廠模式提供一個(gè)創(chuàng)建對(duì)象的接口,但由工廠類決定實(shí)例化哪一個(gè)具體類。它不屬于GoF的23種設(shè)計(jì)模式,但非常常用。
賽事策劃類比:想象一家專業(yè)的賽事策劃公司,它提供幾個(gè)標(biāo)準(zhǔn)化的“賽事套餐”,例如“企業(yè)趣味運(yùn)動(dòng)會(huì)套餐”、“半程馬拉松套餐”和“電競(jìng)賽事套餐”。客戶(客戶端代碼)只需告訴前臺(tái)(工廠類)“我需要一個(gè)馬拉松套餐”,前臺(tái)就會(huì)根據(jù)預(yù)設(shè)好的流程,調(diào)用相應(yīng)的資源(如場(chǎng)地租賃團(tuán)隊(duì)、計(jì)時(shí)服務(wù)商、醫(yī)療安保團(tuán)隊(duì)),組合并交付一個(gè)完整的、不可定制的標(biāo)準(zhǔn)化賽事產(chǎn)品(具體產(chǎn)品)。
Java代碼核心:`java
// 產(chǎn)品接口:賽事
public interface Event {
void organize();
}
// 具體產(chǎn)品:馬拉松
public class MarathonEvent implements Event {
@Override
public void organize() { System.out.println("組織馬拉松賽事..."); }
}
// 簡(jiǎn)單工廠
public class EventFactory {
public static Event createEvent(String type) {
if ("marathon".equals(type)) return new MarathonEvent();
if ("esports".equals(type)) return new EsportsEvent();
throw new IllegalArgumentException("未知賽事類型");
}
}
// 客戶端使用
Event event = EventFactory.createEvent("marathon");
event.organize();`
優(yōu)點(diǎn)與局限:結(jié)構(gòu)簡(jiǎn)單,客戶端與具體產(chǎn)品解耦。但工廠類職責(zé)過重,增加新賽事類型(如“自行車賽”)需要修改工廠類邏輯,違反了開閉原則。這就像公司每推出一個(gè)新套餐,都需要重新培訓(xùn)前臺(tái)的所有流程。
第二部分:工廠方法模式 —— 專業(yè)賽事事業(yè)部
模式定義:定義一個(gè)用于創(chuàng)建對(duì)象的接口,但讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類。
賽事策劃類比:公司發(fā)展壯大,成立了不同的事業(yè)部,每個(gè)事業(yè)部專精于一類賽事。公司總部(抽象創(chuàng)建者)定義了一套創(chuàng)建賽事的標(biāo)準(zhǔn)流程接口(createEvent方法),但具體執(zhí)行由“馬拉松事業(yè)部”(具體創(chuàng)建者)和“電競(jìng)賽事事業(yè)部”(另一個(gè)具體創(chuàng)建者)各自實(shí)現(xiàn)。客戶需要馬拉松時(shí),就直接聯(lián)系馬拉松事業(yè)部,他們用自己最專業(yè)的方式生產(chǎn)賽事。
Java代碼核心:`java
// 創(chuàng)建者抽象類
public abstract class EventOrganizer {
// 工廠方法
public abstract Event createEvent();
public void plan() {
Event event = createEvent(); // 由子類決定創(chuàng)建什么
event.organize();
}
}
// 具體創(chuàng)建者:馬拉松事業(yè)部
public class MarathonOrganizer extends EventOrganizer {
@Override
public Event createEvent() {
// 可以在此處進(jìn)行復(fù)雜的、馬拉松特有的初始化
return new MarathonEvent();
}
}
// 客戶端使用
EventOrganizer organizer = new MarathonOrganizer();
organizer.plan();`
優(yōu)點(diǎn)與局限:完美遵循開閉原則。要增加“自行車賽”,只需新建一個(gè)CyclingOrganizer事業(yè)部即可,無需修改任何現(xiàn)有代碼。系統(tǒng)更靈活,但類的數(shù)量會(huì)增多。這體現(xiàn)了“專業(yè)的人做專業(yè)的事”的策劃理念。
第三部分:抽象工廠模式 —— 大型綜合賽事解決方案
模式定義:提供一個(gè)接口,用于創(chuàng)建相關(guān)或依賴對(duì)象的家族,而不需要明確指定具體類。
賽事策劃類比:公司要承接奧運(yùn)會(huì)、亞運(yùn)會(huì)等超大型綜合賽事。這類賽事不是一個(gè)單一產(chǎn)品,而是由一系列相關(guān)聯(lián)的產(chǎn)品族構(gòu)成:例如“賽事核心服務(wù)”(計(jì)時(shí)、成績(jī)管理)和“賽事周邊服務(wù)”(吉祥物、紀(jì)念品)。公司為此設(shè)立“大型綜合賽事解決方案中心”(抽象工廠),該中心能提供一套兼容的、風(fēng)格統(tǒng)一的服務(wù)組合。對(duì)于“2024夏季風(fēng)格”和“2026冬季風(fēng)格”兩種不同的主題,分別有對(duì)應(yīng)的“夏季風(fēng)格工廠”和“冬季風(fēng)格工廠”來生產(chǎn)整套服務(wù),確保計(jì)時(shí)系統(tǒng)、吉祥物設(shè)計(jì)、獎(jiǎng)牌樣式等在同一個(gè)主題下是協(xié)調(diào)一致的。
Java代碼核心:`java
// 抽象產(chǎn)品族A:核心服務(wù)
public interface CoreService {
void provide();
}
public class SummerCoreService implements CoreService { ... }
// 抽象產(chǎn)品族B:周邊服務(wù)
public interface PeripheralService {
void design();
}
public class SummerPeripheralService implements PeripheralService { ... }
// 抽象工廠
public interface MegaEventFactory {
CoreService createCoreService();
PeripheralService createPeripheralService();
}
// 具體工廠:夏季風(fēng)格工廠
public class SummerStyleFactory implements MegaEventFactory {
@Override
public CoreService createCoreService() { return new SummerCoreService(); }
@Override
public PeripheralService createPeripheralService() { return new SummerPeripheralService(); }
}
// 客戶端使用
MegaEventFactory factory = new SummerStyleFactory();
CoreService core = factory.createCoreService();
PeripheralService peripheral = factory.createPeripheralService();
// 得到的一定是風(fēng)格協(xié)調(diào)的一套服務(wù)`
優(yōu)點(diǎn)與局限:保證了產(chǎn)品族內(nèi)的約束和一致性,特別適合需要構(gòu)建一系列相關(guān)依賴對(duì)象的場(chǎng)景。但擴(kuò)展產(chǎn)品族(比如新增“餐飲服務(wù)”)非常困難,需要修改所有工廠接口和類;而擴(kuò)展產(chǎn)品等級(jí)(新增“秋季風(fēng)格工廠”)則相對(duì)容易。
對(duì)比與策劃啟示
| 模式 | 核心比喻 | 創(chuàng)建焦點(diǎn) | 擴(kuò)展性(新類型) | 策劃理念對(duì)應(yīng) |
| :--- | :--- | :--- | :--- | :--- |
| 簡(jiǎn)單工廠 | 標(biāo)準(zhǔn)化套餐前臺(tái) | 一個(gè)方法創(chuàng)建所有對(duì)象 | 需修改工廠,違反開閉原則 | 快速、標(biāo)準(zhǔn)化的輕量級(jí)項(xiàng)目 |
| 工廠方法 | 專業(yè)事業(yè)部 | 一個(gè)方法創(chuàng)建一個(gè)產(chǎn)品 | 易于擴(kuò)展,增加新事業(yè)部即可 | 專業(yè)化分工,中大型專項(xiàng)賽事 |
| 抽象工廠 | 綜合解決方案中心 | 多個(gè)方法創(chuàng)建一族產(chǎn)品 | 產(chǎn)品族難擴(kuò)展,產(chǎn)品等級(jí)易擴(kuò)展 | 超大型、多維度、強(qiáng)協(xié)調(diào)性的綜合賽事 |
在賽事策劃與軟件設(shè)計(jì)中,選擇合適的“創(chuàng)建”模式至關(guān)重要。理解從“簡(jiǎn)單套餐”到“專業(yè)分工”再到“體系化解決方案”的演進(jìn),不僅能幫助我們寫出更優(yōu)雅、更易維護(hù)的Java代碼,也能啟發(fā)我們以模塊化、可擴(kuò)展的思維去規(guī)劃和設(shè)計(jì)現(xiàn)實(shí)世界中復(fù)雜項(xiàng)目的生產(chǎn)流程。