简单工厂模式

 

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)简单工厂模式的结构

工厂模式的 UML 图

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种设计模式。

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。工厂模式是最常用的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。