什么是简单工厂模式?
简单工厂模式,也称为静态工厂方法模式,是一种常用的创建型设计模式。
在这个模式中,这个工厂类被用来创建对象,客户端以这个类为中介得到所需的对象。
这个工厂类通常有一个方法,根据客户端的需求来决定应该创建哪种产品类的实例。
代码举例
以下是简单工厂模式的一个例子,这个例子是一个动物工厂,可以创建不同类型的动物:
interface Animal {
void speak();
}
class Dog implements Animal {
public void speak() {
System.out.println("汪汪!");
}
}
class Cat implements Animal {
public void speak() {
System.out.println("喵喵!");
}
}
// 工厂类
class AnimalFactory {
public static Animal createAnimal(String type) {
if (type.equalsIgnoreCase("dog")) {
return new Dog();
} else if (type.equalsIgnoreCase("cat")) {
return new Cat();
}
return null;
}
}
// 客户端
public class FactoryPatternExample {
public static void main(String[] args) {
Animal myDog = AnimalFactory.createAnimal("dog");
myDog.speak(); // “汪汪!”
Animal myCat = AnimalFactory.createAnimal("cat");
myCat.speak(); // “喵喵!”
}
}
在这个例子中,
AnimalFactory: 是工厂类,这个类被用来创建对象,客户端以这个类为中介得到所需的对象。
createAnimal(String type): 工厂类中的静态方法,它根据传入的字符串创建相应的 Animal 实例。
Dog 和 Cat 则是具体的产品类,它们都实现了 Animal 接口。
优点
- 简单工厂模式的主要优点是对象的创建逻辑和客户端的代码解耦。
- 此外,如果需要添加新的产品类,只需要修改工厂方法即可,而无需修改使用这些产品的代码。
缺点
然而,简单工厂模式也有一些缺点。
- 首先,工厂方法可能会变得非常复杂,特别是当有大量的产品类时。
- 此外,这个模式不支持开闭原则,因为每次添加新的产品类都需要修改工厂方法。
因此,在有大量产品类且经常需要添加新产品的情况下,可能更适合使用其他的创建型模式,如工厂方法模式或抽象工厂模式。
举例JDK8使用简单工厂模式的地方
java.util.Calendar 类有几个 getInstance() 方法,根据提供的不同输入参数(如 TimeZone 和 Locale),返回不同的 Calendar 对象。
我们进入java.util.Calendar#getInstance()方法中:
然后进入java.util.Calendar#createCalendar方法,在这个方法内部,会根据参数决定实例化哪个类。
最后将这个类对象返回给请求者。
在java/util/Calendar.java类的内部中,有这些地方使用到了这个方法。
客户端只需通过调用这个类的这些方法,就可以得到需要的实例对象,而对象的创建过程被封装在了
java.util.Calendar#createCalendar这个方法中,这个方法与客户端是解耦的。