1. 定义
定义一个工厂类,和一个静态的工厂方法,可以根据参数的不同返回不同类的实例,在客户端将类的使用与创建分离,这就是简单工厂模式(Simple Factory Pattern)
2. 简单工厂模式的结构图
角色介绍;
1. Factory(工厂角色):负责实现创建所有产品实例的内部逻辑;工厂类可以被外界调用,创建所需的产品对象;在工厂类中提供了静态工厂方法factoryMethod()返回类型为抽象产品类型Product
2. Product(抽象产品角色):工厂类所创建的所有对象的父类,封装了各种产品对象的公有的方法
3. ConcreteProduct(具体产品角色):简单工厂模式创建的目标
有时为了简化简单工厂模式,可以将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中
3. 实战案例
使用简单工厂模式设计一个可以创建不同几何形状(如圆形,长方形和三角形等)的绘图工具,每个几何图形都具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,返回空.
代码实现
//抽象几何图形接口
public interface Geometry {
void draw();
void erase();
static Geometry createGeometry(GraphType gt) {
switch (gt) {
case CYCLE:
return new CycleDrawing();
case RECTANGLE:
return new RectangleDrawing();
case TRIANGLE:
return new TriangleDrawing();
default:
return null;
}
}
}
//图形类型枚举类
public enum GraphType {
CYCLE("cycle"),RECTANGLE("rectangle"),TRIANGLE("triangle");
private String title;
GraphType(String title) {
this.title = title;
}
}
//具体几何图形: 长方形
public class RectangleDrawing implements Geometry {
@Override
public String toString() {
return "RectangleDrawing";
}
@Override
public void draw() {
System.out.println("画了一个长方形");
}
@Override
public void erase() {
System.out.println("擦掉了一个长方形");;
}
}
//具体几何图形: 三角形
public class TriangleDrawing implements Geometry {
@Override
public String toString() {
return "TriangleDrawing";
}
@Override
public void draw() {
System.out.println("画了一个三角形");
}
@Override
public void erase() {
System.out.println("擦除了一个三角形");
}
}
//具体几何图形: 圆形
public class CycleDrawing implements Geometry {
@Override
public String toString() {
return "CycleDrawing";
}
@Override
public void draw() {
System.out.println("画了一个圆");
}
@Override
public void erase() {
System.out.println("擦掉了一个圆");
}
}
//客户端代码
public class Main {
public static void main(String[] args) {
Geometry geometry = Geometry.createGeometry(GraphType.CYCLE);
geometry.draw();
geometry.erase();
}
}
6. 简单工厂应用场景
1. 工厂类负责创建对象比较少,由于创建对象较少不会造成工厂方法中的业务逻辑太过于复杂
2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心