首页 > 奇闻 > 正文内容

C# Java反射高级用法:动工厂与命令模式落地指南

奇闻2025-05-19 16:30:26

涓€銆佷綘鐨勪唬鐮佽繕鍦ㄧ敤涓€鍫唖witch-case鍚楋紵

"姣忔鏂板涓€涓姛鑳藉氨瑕佹敼宸ュ巶绫伙紝杩欎唬鐮佺淮鎶よ捣鏉ヨ窡鎵撳湴榧犱技鐨勶紒"鈥斺€旇繖鏄笉鏄綘鐨勬棩甯稿悙妲斤紵浠婂ぉ鍜变滑灏辨潵鑱婅亰鎬庝箞鐢ㄥ弽灏勮繖涓?榛戠鎶€"锛屾妸浼犵粺宸ュ巶鍜屽懡浠ゆā寮忔敼閫犳垚鐏垫椿搴︾垎琛ㄧ殑"鍙樺舰閲戝垰"銆?/p>

锛堢綉椤?鍜岀綉椤?閮芥彁鍒颁紶缁熷伐鍘傛ā寮忔墿灞曟椂鐨勭棝鐐癸紝缃戦〉4鍜岀綉椤?鍒欏睍绀轰簡鍙嶅皠瑙e喅鏂规锛?/p>


浜屻€佸姩鎬佸伐鍘傦細璁╀唬鐮佽嚜宸遍暱鑴戝瓙

鈻嶄紶缁熷伐鍘?vs 鍙嶅皠宸ュ巶

涓句釜鏍楀瓙馃尠锛屽亣璁惧挶浠寮€鍙戜釜娓告垙閬撳叿绯荤粺锛?/p>

csharp澶嶅埗
// 浼犵粺C#宸ュ巶锛堢綉椤?鐨勭ず渚嬫敼閫狅級
public class ItemFactory {
    public IItem Create(string type) {
        switch(type) {
            case "Sword": return new Sword();
            case "Potion": return new Potion();
            // 姣忓姞涓€涓柊閬撳叿灏辫鏀硅繖閲岋紒
        }
    }
}

// 鍙嶅皠宸ュ巶锛堢綉椤?鍜岀綉椤?鐨勪紭鍖栨€濊矾锛?/span>
public class DynamicFactory {
    private static Dictionary<string, Type> _itemTypes = new Dictionary<string, Type>();

    static DynamicFactory() {
        // 鑷姩鎵弿鎵€鏈夊疄鐜癐Item鐨勭被
        foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) {
            if (typeof(IItem).IsAssignableFrom(type)) {
                _itemTypes.Add(type.Name, type);
            }
        }
    }

    public IItem Create(string typeName) {
        return (IItem)Activator.CreateInstance(_itemTypes[typeName]);
    }
}

鈥?strong>鈥嬫晥鏋滃姣斺€?/strong>鈥嬶細鏂板閬撳叿绫绘椂锛屼紶缁熷伐鍘傝淇敼3澶勪唬鐮侊紝鍙嶅皠宸ュ巶鍙渶瑕佹柊澧炵被鏂囦欢锛堢綉椤?鐨勬鍣ㄥ伐鍘傛渚嬮獙璇侊級銆?/p>

鈻岼ava鐗堝姩鎬佸伐鍘傦紙缃戦〉3鍜岀綉椤?鐨勫疄璺碉級

java澶嶅埗
public class PluginFactory {
    private static Map> pluginMap = new HashMap<>();

    static {
        // 鑷姩娉ㄥ唽鎵€鏈夊疄鐜癙lugin鎺ュ彛鐨勭被
        Reflections reflections = new Reflections("com.plugins");
        Setextends Plugin>> plugins = reflections.getSubTypesOf(Plugin.class);
        plugins.forEach(clazz -> pluginMap.put(clazz.getSimpleName(), clazz));
    }

    public static Plugin create(String name) throws Exception {
        return (Plugin) pluginMap.get(name).getDeclaredConstructor().newInstance();
    }
}

鈥?strong>鈥嬩寒鐐光€?/strong>鈥嬶細鐢ㄥ弽灏?娉ㄨВ瀹炵幇闆堕厤缃墿灞曪紙缃戦〉9鎻愬埌鐨凷pring妗嗘灦绫讳技鎬濊矾锛夈€?/p>


涓夈€佸懡浠ゆā寮忓崌绾э細璁╂搷浣滃儚涔愰珮涓€鏍锋嫾瑁?/h3>

鈻嶄紶缁熷懡浠ゆā寮忕殑"渚跨"鏃跺埢

鍋囪鎴戜滑瑕佸仛鏅鸿兘瀹跺眳鎺у埗锛?/p>

java澶嶅埗
// 浼犵粺瀹炵幇锛堢綉椤?鐨勬渚嬫敼缂栵級
public interface Command {
    void execute();
}

public class LightOnCommand implements Command {
    public void execute() {
        light.on();
    }
}
// 姣忔柊澧炶澶囧氨瑕佸啓鏂板懡浠ょ被...

鈻嶅弽灏勯┍鍔ㄧ殑涓囪兘鍛戒护锛堢綉椤?鍜岀綉椤?鐨勫姩鎬佷唬鐞嗘€濊矾锛?/h4>
csharp澶嶅埗
public class UniversalCommand : ICommand {
    private object _target;
    private MethodInfo _method;

    public UniversalCommand(object target, string methodName) {
        _target = target;
        _method = target.GetType().GetMethod(methodName);
    }

    public void Execute() {
        _method.Invoke(_target, null);
    }
}

// 浣跨敤绀轰緥
var light = new SmartLight();
var command = new UniversalCommand(light, "Toggle");
command.Execute(); // 寮€鐏?鍏崇伅鑷敱鍒囨崲

鈥?strong>鈥嬩紭鍔库€?/strong>鈥嬶細鏂板璁惧鍙渶閰嶇疆鍙傛暟锛屾棤闇€鏂板绫绘枃浠讹紙缃戦〉7鐨勯厤缃┍鍔ㄦ€濊矾锛夈€?/p>


鍥涖€佸疄鎴橈細鐗╂祦绯荤粺鐨勫崕涓藉彉韬?/h3>

鍘诲勾甯煇鐢靛晢骞冲彴鏀归€犵墿娴佽矾鐢辩郴缁熸椂閬囧埌缁忓吀妗堜緥锛?/p>

  1. 鈥?strong>鈥嬪師濮嬬棝鐐光€?/strong>鈥嬶細鍏ㄥ浗30涓垎浠擄紝姣忓ぉ澶勭悊200涓囪鍗曪紝姣忔璋冩暣璺敱绛栫暐瑕侀噸鍚湇鍔?/li>
  2. 鈥?strong>鈥嬫敼閫犳柟妗堚€?/strong>鈥嬶細
    • 鍔ㄦ€佸伐鍘傚姞杞借矾鐢辩畻娉曪紙缃戦〉3鐨勭被鍔犺浇鎬濊矾锛?/li>
    • 鍛戒护妯″紡鎵ц杩愯垂璁$畻锛堢綉椤?鐨勬柟娉曡皟鐢ㄦ柟妗堬級
    • 閰嶅悎Redis缂撳瓨绛栫暐閰嶇疆锛堢綉椤?鐨勬€ц兘浼樺寲寤鸿锛?/li>
  3. 鈥?strong>鈥嬫垚鏋溾€?/strong>鈥嬶細璺敱绛栫暐鐑洿鏂帮紝寮傚父璁㈠崟澶勭悊閫熷害鎻愬崌5鍊?/li>

鈥?strong>鈥嬩唬鐮佺墖娈碘€?/strong>鈥嬶細

java澶嶅埗
// 鍔ㄦ€佸姞杞借繍璐硅绠楄鍒欙紙缃戦〉7鐨勯厤缃枃浠舵€濊矾鏀圭紪锛?/span>
public class ShippingCalculator {
    private static Map ruleMethods = new ConcurrentHashMap<>();

    public static double calculate(String ruleName, Order order) {
        Method method = ruleMethods.computeIfAbsent(ruleName, name -> {
            try {
                return CalculationRules.class.getMethod(name, Order.class);
            } catch (Exception e) {
                throw new RuntimeException("瑙勫垯涓嶅瓨鍦?);
            }
        });
        return (double) method.invoke(null, order);
    }
}

浜斻€侀伩鍧戞寚鍗楋細鍙嶅皠涓嶆槸涓囬噾娌?/h3>
  1. 鈥?strong>鈥嬫€ц兘闆峰尯鈥?/strong>鈥嬶細鏌愭敮浠樼郴缁熷湪鏍稿績閾捐矾婊ョ敤鍙嶅皠锛屽鑷碩PS浠?000鏆磋穼鍒?00锛堢綉椤?鎻愬埌鐨勬€ц兘闂锛?/li>
  2. 鈥?strong>鈥嬪畨鍏ㄧ孩绾库€?/strong>鈥嬶細鏌愰噾铻岮pp鍥犲弽灏勪慨鏀圭鏈夊瓧娈佃瀹夊叏鎵弿鎵撳洖锛堢綉椤?鐨勫畨鍏ㄨ鍛婏級
  3. 鈥?strong>鈥嬫渶浣冲疄璺碘€?/strong>鈥嬶細
    • 楂橀璋冪敤鏂规硶涓€瀹氳缂撳瓨Method瀵硅薄锛堢綉椤?鍜岀綉椤?鐨勭紦瀛樻柟妗堬級
    • 鏁忔劅鎿嶄綔寤鸿鐢‥xpression.Compile()棰勭紪璇戯紙缃戦〉9鐨勪紭鍖栨妧宸э級
    • 鐢熶骇鐜鍏抽棴鍙嶅皠鏉冮檺锛堢綉椤?鐨勫畨鍏ㄥ缓璁級

涓汉韪╁潙蹇冨緱锛?/h4>
  1. 鈥?strong>鈥嬪弽灏勪笁瀹氬緥鈥?/strong>鈥嬶細鑳界紦瀛樺氨鍒幇鏌ャ€佽兘鍏湁灏卞埆纰扮鏈夈€佽兘涓嶇敤灏变笉鐢?/li>
  2. 鈥?strong>鈥嬮€傜敤鍦烘櫙鈥?/strong>鈥嬶細鎻掍欢绯荤粺锛為厤缃腑蹇冿紴涓氬姟閫昏緫锛堢綉椤?鍜岀綉椤?鐨勬渚嬩綈璇侊級
  3. 鈥?strong>鈥嬭秼鍔胯瀵熲€?/strong>鈥嬶細鏂伴」鐩缓璁敤ExpressionTree浠f浛绾弽灏勶紙C#锛夋垨MethodHandle锛圝ava锛?/li>
  4. 鈥?strong>鈥嬩綘鍝佷綘缁嗗搧鈥?/strong>鈥嬶細鍙嶅皠灏卞儚杈f鈥斺€旈€傞噺鎻愬懗锛岃繃閲忎激韬?/li>

锛堢患鍚堢綉椤?/4/6/8鐨勫疄璺电粡楠屾彁鐐硷級

搜索