工厂模式概念
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
应用场景
- 日志记录器:用户可以选择日志存储到什么地方
- 数据库访问:用户可以选择数据库
- 设计一个连接服务器的框架
实现案例
- 创建一个接口:
1 2 3
public interface Shape { void draw(); }
- 创建接口的实现
1 2 3 4 5 6 7
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Rectangle method."); } }
1 2 3 4 5 6 7
public class Square implements Shape { @Override public void draw() { System.out.println("Square method."); } }
1 2 3 4 5 6 7
public class Circle implements Shape { @Override public void draw() { System.out.println("Circle method."); } }
- 创建一个工厂,生成基于给定信息的实体类的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
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 if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }
- 调用该工厂,通过传递类型信息来获取实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
public class FactoryDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); //获取 Circle 的对象,并调用它的 draw 方法 Shape shape1 = shapeFactory.getShape("CIRCLE"); //调用 Circle 的 draw 方法 shape1.draw(); //获取 Rectangle 的对象,并调用它的 draw 方法 Shape shape2 = shapeFactory.getShape("RECTANGLE"); //调用 Rectangle 的 draw 方法 shape2.draw(); //获取 Square 的对象,并调用它的 draw 方法 Shape shape3 = shapeFactory.getShape("SQUARE"); //调用 Square 的 draw 方法 shape3.draw(); } }