简单工厂模式
目的
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
解释
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
示例
案例: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 图

真实案例
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());