设计模式之工厂方法模式(Java实现)
Factory Method(工厂方法)
一、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
二、结构
工厂方法模式的结构如图7.27所示。 其中: • Product定义工厂方法所创建的对象的接口。 • ConcreteProduct 实现 Product 接口。 • Creator声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个 工厂方法的默认实现,它返回一个默认的ConcretePioduct对象,可以调用工厂方法以创建一个Product对象。 • ConcreteCreator重定义工厂方法以返回一个ConcreteProduct实例。
三、适用性
Factory Method 模式适用 : • 当一个类不知道它所必须创建的对象的类的时候。 • 当一个类希望由它的子类来指定它所创建的对象的时候。 • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
四、实现
我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。 首先 创建一个接口:。
interface Shape { void draw(); }
然后 创建实现接口的实体类。
class Rectangle implements Shape { @Override public void draw() { System.out.println("矩形被画出来了"); } } class Square implements Shape { @Override public void draw() { System.out.println("正方形被画出来了"); } } class Circle implements Shape { @Override public void draw() { System.out.println("圆被画出来了"); } }
其次 创建一个工厂,生成基于给定信息的实体类的对象。
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; } }
最后 使用该工厂,通过传递类型信息来获取实体类的对象。
public class FactoryMethod { public static void main(String[] args) { // TODO Auto-generated method stub 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(); } }
运行结果:
五、小结
一、一句话概括工厂模式
简单工厂:一个工厂类,一个产品抽象类。 工厂方法:多个工厂类,一个产品抽象类。 抽象工厂:多个工厂类,多个产品抽象类。
二、生活中的工厂模式
简单工厂类:一个麦当劳店,可以生产多种汉堡。 工厂方法类:一个麦当劳店,可以生产多种汉堡。一个肯德基店,也可以生产多种汉堡。 抽象工厂类:百胜餐饮集团下有肯德基和百事公司,肯德基生产汉堡,百事公司生成百事可乐。