简单工厂模式

目的

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

解释

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

示例

案例:Shape类

创建一个shape接口和实现shape接口的多个实体类,然后使用工厂类创建

shape接口

public interface Shape {
   void draw();
}

shape接口的实现类

public class Rectangle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}
// Square.java
public class Square implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}
// Circle.java
public class Circle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

工厂类

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;
   }
}

主程序

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();
   }

可以看到各个实现类的输出

UML 图

工厂模式的 UML 图

真实案例

spring

spring是一种广泛流行的框架,在spring中你可以快速在一个类中得到需要的实例

FactoryBean 就是一个常见的获取实例方法

FactoryBean 实现如下:

public interface FactoryBean {
    T getObject() throws Exception;
    Class<?> getObjectType();
    boolean isSingleton();
}

当你需要使用时,只需要get一下就行

库FXGL

FXGL是用Java语言写的游戏引擎,使用FXGL可以轻松实现跨平台游戏UI编写。

在FXGL中,你可以轻松的创建游戏角色,

public class AccessoryFactory implements EntityFactory {
 
    double bottomSize;
    public AccessoryFactory(){
        bottomSize =0.9* Math.min(getAppWidth(),getAppHeight());
    }
    // 使用注解实现工厂,下面的函数定义了如何生成
    @Spawns("BasicBottom")
    public Entity newBasicBottom(SpawnData data) {
        // 左上∠的方块
 

在使用时只需要使用工厂方法创建就行:

Entity cross = getGameWorld().create("BasicBottom",new SpawnData());