工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式。我看有的书上和有的文章里是分为两种,没有简单工厂。
工厂模式主要的作用是:一个对象在实例化的时候可以选择多个类,在实例化的时候根据一些业务规则来选择实例化哪个类。
1.先定义一个图形接口,有一个画方法
public interface Shape { void draw(); }
2.再创建两个实现接口的实体类
public class Rectangle implements Shape { @Override public void draw() { System.out.println("画长方形。"); } }
public class Square implements Shape { @Override public void draw() { System.out.println("画正方形。"); } }
3.创建一个工厂,生成基于给定信息的实体类的对象
public class ShapeFactory { //使用 createShape 方法获取形状类型的对象 public Shape createShape(String shapeType) { if (shapeType == null) { return null; } if (shapeType.equalsIgnoreCase("RECTANGLE")) { return new Rectangle(); } else if (shapeType.equalsIgnoreCase("SQUARE")) { return new Square(); } return null; } }
4.使用该工厂,通过传递类型信息来获取实体类的对象。
public class SimpleFactoryPatternDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); //获取 Rectangle 的对象,并调用它的 draw 方法 Shape shape1 = shapeFactory.createShape("RECTANGLE"); //调用 Rectangle 的 draw 方法 shape1.draw(); //获取 Square 的对象,并调用它的 draw 方法 Shape shape2 = shapeFactory.createShape("SQUARE"); //调用 Square 的 draw 方法 shape2.draw(); } }
输出:
画长方形。
画正方形。
这里Shape接口声明的变量既可以用Rectangle实例化,也可以用Square实例化。ShapeFactory就是一个工厂,去决定怎么实例化。
这个模式的缺点是对“开-闭”原则的支持不够。如果要新加一个“产品”,比如新加一个实现Shape的圆形类,要在工厂里使用这个圆形类的话,需要去修改ShapeFactory工厂的代码。
那么应该怎么解决这个缺点,下篇工厂方式模式就是解决这个问题。