介绍
严格的说,简单工厂模式并不是23种常用的设计模式之一,它只算工厂模式的一个特殊实现。简单工厂模式在实际中的应用相对于其他2个工厂模式用的还是相对少得多,因为它只适应很多简单的情况。
适用场景
- 需要创建的对象较少。
- 客户端不关心对象的创建过程。
简单工厂模式角色分配:
- 工厂(Factory)角色 :简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
- 抽象产品(Product)角色 :简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
- 具体产品(Concrete Product)角色:简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
简单工厂实例
创建一个可以绘制不同形状的绘图工具,可以绘制圆形,正方形,三角形,每个图形都会有一个draw()方法用于绘图.
(1)创建Shape接口
public interface Shape {
void draw();
}
(2)创建实现该接口的具体图形类
圆形
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Draw Circle");
}
}
长方形
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Draw Rectangle");
}
}
正方形
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Draw Square");
}
}
创建工厂类:
public class ShapeFactory {
// 使用 getShape 方法获取形状类型的对象
public static Shape getShape(String shapeType) {
Shape shape = null;
switch (shapeType) {
case"circle":
shape = new Circle();
break;
case"rectangle":
shape = new Rectangle();
break;
case"square":
shape = new Square();
break;
default:
break;
}
return shape;
}
}
测试方法:
public class Test {
public static void main(String[] args) {
Shape shape;
// 获取 Circle 的对象,并调用它的 draw 方法
shape = ShapeFactory.getShape("circle");
shape.draw();
// 获取 Rectangle 的对象,并调用它的 draw 方法
shape = ShapeFactory.getShape("rectangle");
shape.draw();
// 获取 Square 的对象,并调用它的 draw 方法
shape = ShapeFactory.getShape("square");
shape.draw();
}
}
输出结果:
Draw Circle
Draw Rectangle
Draw Square
-
简单工厂的优点:
松耦合,调用方只需与工厂类交互,无需关心实例怎么创建的。
扩展性强,只需新增一个实现类和修改工厂方法即可,这也算缺点的一方面。
客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。 -
简单工厂的缺点:
最重要的是它违背了我们在概述中说的 开放-封闭原则。因为每次你要新添加一个功能,都需要在生switch-case 语句(或者if-else 语句)中去修改代码,添加分支条件。
由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。