概念:工厂模式提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。
难点:如何写好我们的工厂?
核心思想:又一个工厂根据不同参数来创建不同类型的对象,客户端只需要告诉工厂我想要什么,就可以获取对应的对象。
结构模式:
-
工厂类:负责创建具体产品对象。
-
产品抽象类:定义产品的共同接口或抽象类。
-
具体产品类:实现了产品抽象类的具体类。
优点:
-
客户端不需要知道对象如何创建,降低耦合。
-
管理对象创建集中统一,便于维护。
缺点:
-
扩展新产品时需要修改工厂类代码,不符合开闭原则。
-
如果产品太多,工厂类可能变得庞大难以维护。
eg:比如你要买饮料,你打电话告诉店员你要“可乐”或“雪碧”,店员负责给你准备好。你不需要知道饮料是怎么做出来的。
// 抽象产品
public interface Drink {
void drink();
}
// 具体产品
public class Cola implements Drink {
public void drink() {
System.out.println("喝可乐");
}
}
public class Sprite implements Drink {
public void drink() {
System.out.println("喝雪碧");
}
}
// 工厂类
public class DrinkFactory {
public static Drink getDrink(String type) {
if ("cola".equalsIgnoreCase(type)) {
return new Cola();
} else if ("sprite".equalsIgnoreCase(type)) {
return new Sprite();
} else {
throw new IllegalArgumentException("没有这种饮料");
}
}
}
// 客户端
public class Test {
public static void main(String[] args) {
Drink drink = DrinkFactory.getDrink("cola");
drink.drink(); // 输出:喝可乐
}
}
总结一句话:
简单工厂模式就是用一个专门的工厂类根据参数来创建对象,降低了客户端和产品类的耦合度,但不利于扩展新产品。