简单工厂模式
1. 简单工厂模式的定义
简单工厂模式(Simple Factory Pattern)专门定义一个工厂类来负责创建其它类的范例,被创建的范例具有共同的父类。
简单工厂模式又叫做静态工厂模式,属于创建型模式,它提供了一种创建对象的最佳方式。
在简单工厂模式中,调用者通过提供简单的参数,从工厂类获取所需的产品类的范例。
2. 简单工厂模式的要点
1)目的
简单工厂模式的目的是把对象的创建和使用分离开来。
简单工厂模式通过工厂类的封装了具体产品类的创建过程,从而解除调用程序和具体产品类之间的耦合。
工厂类在创建对象时不会对调用者暴露创建逻辑,并且使用一个共同的接口来指向新创建的对象。
2)优点
- 1、简化对象的创建过程
- 2、降低对象的使用难度
调用者只需提供名称就可以创建一个产品对象,无需了解对象的创建逻辑,简化了客户端创建对象的复杂度。
简单工厂模式屏蔽了产品的具体实现,调用者只关心产品的接口,从而降低了客户端使用对象的难度。
3)缺点
- 1、违反开闭原则,每增加一个产品,都需要增加一个产品类,同时修改工厂类代码。
4)使用场景
- 1、工厂类负责创建的对象比较少。
- 2、客户端只需知道传入工厂类的参数,对于如何创建对象不关心。
5)应用范例
- 1、struts框架中配合xml配置文件和Java反射机制,使用简单工厂模式生成各种Action范例。
3. 简单工厂模式的范例
我们首先创建一个 Shape 接口和实现 Shape 接口的实体类,然后定义一个工厂类 ShapeFactory,用于创建 Shape 的实体类。
FactoryPatternDemo 类是客户端,它使用 ShapeFactory 来获取 Shape 对象,对象的类型由参数指定。
1)简单工厂模式的结构
2)简单工厂模式的实现
package com.codebaoku.simplefactory; /** * Shape 接口类 * @author 编程宝库 * */ public interface Shape { void draw(); } /** * Rectangle 实体类 * @author 编程宝库 * */ public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } } /** * Circle 实体类 * @author 编程宝库 * */ public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } } /** * Square 实体类 * @author 编程宝库 * */ public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } } /** * ShapeFactory 工厂类 * @author 编程宝库 * */ 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; } } /** * 客户端,调用工厂类 * @author 编程宝库 * */ public class FactoryPatternDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); // 获取 Circle 的对象,并调用它的 draw 方法 Shape sc = shapeFactory.getShape("Circle"); sc.draw(); // 获取 Rectangle 的对象,并调用它的 draw 方法 Shape sr = shapeFactory.getShape("Rectangle"); sr.draw(); // 获取 Square 的对象,并调用它的 draw 方法 Shape ss = shapeFactory.getShape("Square"); ss.draw(); } }
执行程序,输出结果:
Inside Circle::draw() method. Inside Rectangle::draw() method. Inside Square::draw() method.
简单工厂模式是工厂模式的简化形式,在实际使用中并不多见,因为它违背了开闭原则,不易维护,更常用的是工厂模式。简单工厂模式不属于 GOF 提出的23种设计模式。
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。工厂模式是最常用的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。