0 工厂模式的介绍
工厂模式属于创建型模式,是Java中最常见的设计模式之一。工厂模式提供了一种将对象的实例化过程封装在工厂类的方式,通过工厂模式可以屏蔽掉对象的创建过程,对外提供了一种统一的接口来创建不同类型的对象。
优点:
- 一个调用者想创建一个对象只需要知道其名称即可
- 可扩展性高,新增一个产品只需要扩展一个工厂类
缺点:
- 每增加一个产品时都需要增加一个对象实现工厂和实现类,这使得系统中类的数量增加,一定程度上增加了系统类的复杂程度。
1 核心角色
工厂模式中包含了一下几个核心角色:
- 抽象产品:定义了产品的共同接口或者抽象类。抽象产品可以是所有具体产品的父类或接口,表示所有具体产品共有的方法。
- 具体产品:实现抽象产品接口,定义具体产品特定的行为。
- 工厂类:用于声明创建产品的抽象方法,一个工厂内可以声明多个不同产品的抽象方法。
- 工厂对象:工厂类的实例化对象,负责创建具体产品的对象。
2 实现案例
创建一个 Shape 接口和实现 Shape 接口的实体类。然后定义工厂类 ShapeFactory。
FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。
2.1 创建接口Shape
public interface Shape {
void draw();
}
2.2 创建实现接口的实现类
矩形实现类:
public class Rectangle implements Shape{
@Override
public void draw() {
System.out.println("矩形~");
}
}
圆形实现类:
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("圆形~");
}
}
正方形实现类:
public class Square implements Shape{
@Override
public void draw() {
System.out.println("正方形~");
}
}
2.3 创建工厂类,生成指定产品的实体类对象
public class ShapeFactory {
//使用getShape方法获取对应的形状类型
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();
} else {
return new Square();
}
}
}
2.4 创建工厂对象,调用具体产品的对象方法
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//获取圆形的对象,并调用draw方法
Shape circle = shapeFactory.getShape("CIRCLE");
circle.draw();
//获取矩形的对象,并调用draw方法
Shape rectangle = shapeFactory.getShape("RECTANGLE");
rectangle.draw();
//获取正方形的对象,并调用draw方法
Shape square = shapeFactory.getShape("SQUARE");
square.draw();
}
}