什么是工厂模式?
工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,将对象的实例化逻辑封装在工厂类中。通过使用工厂模式,客户端可以通过调用工厂类的方法来创建对象,而无需直接使用new关键字实例化对象。
主要解决什么问题?
工厂模式主要解决以下问题:
封装对象的实例化过程:工厂类负责对象的实例化,客户端只需要调用工厂类的方法即可获取对象,无需关注对象的创建细节。
解耦对象的创建和使用:通过使用工厂模式,客户端与具体对象的实例化过程解耦,使得客户端代码更加灵活和可维护。
在什么时候我们需要使用工厂模式?
工厂模式适用于以下情况:
当创建对象的过程比较复杂,包含一些逻辑判断或依赖其他对象时,可以使用工厂模式将这些复杂的创建逻辑封装起来。
当需要封装对象的实例化过程,隐藏具体实现细节时,可以使用工厂模式。
用一个生活中的应用实例来举例、类比:
想象你要购买一台电脑,但你不需要了解电脑的具体制造过程。你可以去电脑商店,告诉销售员你的需求,然后销售员将根据你的需求从仓库中选择合适的电脑品牌和型号。在这种情况下,电脑商店充当了一个工厂,根据你的需求提供了合适的电脑。
优点:
将对象的创建逻辑集中在一个工厂类中,提高了代码的可维护性和可读性。
客户端与具体对象的实例化过程解耦,使得客户端代码更加灵活和可扩展。
可以通过工厂方法返回相同类型的不同实现,实现了多态性。
缺点:
引入工厂类增加了代码的复杂性和额外的开销。
当需要创建的对象比较简单时,使用工厂模式可能会过度设计,增加了不必要的复杂性。
使用场景:
当需要封装对象的实例化过程,隐藏具体实现细节时。
当创建对象的过程比较复杂,包含一些逻辑判断或依赖其他对象时。
示例代码:
下面是一个简单的示例代码,展示了工厂模式的应用。假设我们有一个图形接口Shape,我们希望通过工厂模式创建不同类型的图形对象。
public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println(“Drawing a circle”);
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println(“Drawing a rectangle”);
}
}
public class ShapeFactory {
public Shape createShape(String shapeType) {
if (shapeType.equalsIgnoreCase(“circle”)) {
return new Circle();
} else if (shapeType.equalsIgnoreCase(“rectangle”)) {
return new Rectangle();
}
return null;
}
}
// 示例使用
public class FactoryExample {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
Shape circle = shapeFactory.createShape(“circle”);
circle.draw();
Shape rectangle = shapeFactory.createShape("rectangle");
rectangle.draw();
运行上述代码,将会输出以下结果:
Drawing a circle
Drawing a rectangle
在这个示例中,Shape
是一个接口,Circle
和Rectangle
是实现了Shape
接口的具体图形类。ShapeFactory
是工厂类,它根据传入的参数创建相应的图形对象。客户端可以通过调用工厂类的createShape
方法来获取所需的图形对象,而无需直接实例化具体的图形类。这样,客户端与具体图形类的实例化过程解耦,同时也隐藏了具体实现细节。