魔鸡马奇克2免安装绿色中文版
175M · 2025-09-17
嘿,朋友!你是不是也遇到过代码里满是 new
关键字,每次加个新功能都得改一大堆老代码的窘境?别担心,这几乎是每个程序员的必经之路。今天,我就带你走一趟工厂模式的进化之旅,从最基础的“硬编码”到高手常用的“自动化”工厂,保证让你豁然开朗,写出更优雅、更易于扩展的代码。
一开始,我们都喜欢简单粗暴。比如,给咖啡馆写个订单系统,顾客点什么,我们就直接在代码里 new
一个对应的对象。
代码长这样:
Java
public class OrderService {
public void takeOrder(String coffeeType) {
Coffee coffee;
if ("americano".equals(coffeeType)) {
coffee = new Americano();
} else if ("latte".equals(coffeeType)) {
coffee = new Latte();
}
coffee.prepare();
}
}
问题显而易见:
OrderService
的老代码。这就像往一栋建好的房子里塞新房间,风险太大。OrderService
的本职是处理订单,而不是操心怎么制作咖啡。它现在既是服务员又是咖啡师,分工不明确。为了解决这个痛点,我们把创建咖啡的活儿交给一个专门的“咖啡机”——简单工厂。
核心思想:用一个专门的工厂类来统一管理对象的创建。
UML 图:
// 简单工厂
public class SimpleCoffeeFactory {
public static Coffee createCoffee(String type) {
if ("americano".equals(type)) {
return new Americano();
} else if ("latte".equals(type)) {
return new Latte();
}
return null;
}
}
// 客户端代码
public class OrderService {
public void takeOrder(String coffeeType) {
Coffee coffee = SimpleCoffeeFactory.createCoffee(coffeeType);
if (coffee != null) {
coffee.prepare();
}
}
}
适用场景:
不足:
CoffeeFactory
里的 if-else
链会越来越长,变成一个难以维护的“巨无霸”。当咖啡馆的菜单每周都更新时,简单工厂的弊端就暴露了。我们得想个更灵活的办法。
核心思想:让每个产品都有自己的专属工厂。
UML 图:
// 抽象工厂接口
public interface CoffeeFactory {
Coffee createCoffee();
}
// 具体工厂
public class AmericanoFactory implements CoffeeFactory {
@Override
public Coffee createCoffee() {
return new Americano();
}
}
public class LatteFactory implements CoffeeFactory {
@Override
public Coffee createCoffee() {
return new Latte();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
CoffeeFactory factory = new AmericanoFactory();
Coffee coffee = factory.createCoffee();
coffee.prepare();
}
}
适用场景:
不足:
我们的咖啡馆现在有了套餐服务:美式套餐配芝士蛋糕,拿铁套餐配曲奇。这些产品需要成套生产。
核心思想:一个工厂负责创建一整套相关产品。
UML 图:
// 抽象产品
public interface Dessert { void serve(); }
public class Cheesecake implements Dessert { ... }
public class Cookie implements Dessert { ... }
// 抽象工厂
public interface ComboFactory {
Coffee createCoffee();
Dessert createDessert();
}
// 具体工厂
public class AmericanoComboFactory implements ComboFactory {
@Override
public Coffee createCoffee() { return new Americano(); }
@Override
public Dessert createDessert() { return new Cheesecake(); }
}
适用场景:
不足:
现在,我们希望我们的系统足够智能,能根据配置文件动态选择工厂,让代码彻底告别 new
的烦恼。
核心思想:用一个中央注册中心来管理所有工厂。
UML 图:
// 工厂注册中心(单例模式实现)
public class FactoryRegistry {
private static final Map<String, ComboFactory> factories = new HashMap<>();
public static void register(String name, ComboFactory factory) {
factories.put(name, factory);
}
public static ComboFactory getFactory(String name) {
return factories.get(name);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 程序启动时注册所有工厂
FactoryRegistry.register("americano_combo", new AmericanoComboFactory());
FactoryRegistry.register("latte_combo", new LatteComboFactory());
// 客户端通过名称获取工厂,完全不依赖具体类名
ComboFactory factory = FactoryRegistry.getFactory("americano_combo");
Coffee coffee = factory.createCoffee();
Dessert dessert = factory.createDessert();
}
}
适用场景:
你可能觉得这些理论听起来很酷,但离实际工作很远。其实不然,工厂模式无处不在。
ApplicationContext
)就是一个超级工厂,负责管理、创建和装配所有对象(bean)。你只需要通过注解或配置告诉它怎么做,剩下的事情它都帮你搞定。GUIFactory
接口可能包含 createButton()
和 createCheckbox()
方法。在 Windows 上,使用 WindowsGUIFactory
来创建 WindowsButton
和 WindowsCheckbox
;在 macOS 上,则使用 MacOSGUIFactory
来创建 MacOSButton
和 MacOSCheckbox
。总结:
175M · 2025-09-17
302M · 2025-09-17
318M · 2025-09-17
鹅鸭杀身份窃贼怎么玩
vivo X300 手机核心配置曝光:6.31 英寸 1.5K+120Hz LTPO 小直屏、首发天玑 9500 + 独家 V3+ 影像芯片