厂商模式(Factory Pattern)是一种常用的面向对象设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,我们不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
厂商模式的优点
- 封装性:厂商模式将对象的创建与使用分离,使得系统更加灵活和易于扩展。
- 降低耦合度:客户端不需要知道具体类的创建细节,只需要知道所对应的接口即可。
- 易于维护:如果需要更换或添加新的产品,只需修改厂商类中的代码,而无需改动客户端代码。
厂商模式的结构
- 抽象产品(Product):定义了产品的接口,是所有具体产品的父类。
- 具体产品(Concrete Product):实现了抽象产品接口的具体类。
- 厂商(Creator):声明了一个创建对象的方法,可以返回一个Product类型的对象。
- 具体厂商(Concrete Creator):实现厂商接口,负责实例化具体的产品。
案例分析
假设我们需要开发一个图形绘制软件,该软件支持多种形状的绘制,如圆形、矩形等。我们可以使用厂商模式来实现这一功能。
1. 定义抽象产品
// 抽象产品
public interface Shape {
void draw();
}
2. 具体产品
// 具体产品 - 圆形
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");
}
}
3. 厂商
// 厂商
public abstract class ShapeFactory {
// 使用getShape方法获取形状类型
public abstract Shape getShape(String shapeType);
}
// 具体厂商
public class ConcreteShapeFactory extends ShapeFactory {
@Override
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
}
4. 客户端代码
public class Client {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ConcreteShapeFactory();
// 获取圆形对象并调用draw方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
// 获取矩形对象并调用draw方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
}
}
总结
通过上述案例可以看出,厂商模式有效地将对象的创建过程与使用过程分离,使得系统更加灵活和易于扩展。当需要增加新的形状时,只需在厂商类中添加相应的逻辑,而无需修改客户端代码,从而降低了系统的耦合度,提高了代码的可维护性和可扩展性。