06.创建型 - 工厂方法模式(Factory Method Pattern)

工厂方法模式(Factory Method Pattern)

参考 - https://mp.weixin.qq.com/s/CEjsRLlQlP0BZpNroCJ2uQ
参考 - https://www.runoob.com/design-pattern/factory-pattern.html

相比简单工厂, 工厂方法可以被看做是一个升级为设计模式的变种.

例如: 一个打飞机的游戏, 首先来定义所有敌人的总抽象

UML类图

Pasted image 20231117203139

代码实例

1.抽象产品 及 实现

  1. 抽象出'敌人'和 '飞机', '坦克'子类型实现
//敌人
public abstract class Enemy {    
    //初始化坐标
    public Enemy(int x, int y){
        this.x = x;
        this.y = y;
    }
}
//飞机类型敌人
public class Airplane extends Enemy {
	public Airplane(int x, int y){
		super(x, y);//调用父类构造子初始化坐标
		
	}
}
//坦克类型敌人
public class Tank extends Enemy {
    public Tank(int x, int y){
        super(x, y);
    }
}

对于一个正常的游戏逻辑, 纵坐标y等于0, 敌人位置应该是随机, 也就是坐标x, 创建逻辑如下:

public static void main(String[] args) {
	int screenWidth = 100;//屏幕宽度
	System.out.println("游戏开始");
	Random random = new Random();//准备随机数

	int x = random.nextInt(screenWidth);//生成敌机横坐标随机数
	Enemy airplan = new Airplane(x, 0);//实例化飞机
	airplan.show();//显示飞机
	
	x = random.nextInt(screenWidth);//坦克同上
	Enemy tank = new Tank(x, 0);
	tank.show();
	/*输出结果: 
		游戏开始
		飞机出现坐标: 94,0
		飞机向玩家发起攻击……
		坦克出现坐标: 89,0
		坦克向玩家发起攻击……
	*/
}

问题: 实例化出现重复的逻辑, 实际的逻辑会更复杂;

2.抽象工厂的工厂及实现

//将工厂抽象出来 <重点!>
public interface Factory {
    public Enemy create(int screenWidth);
}

//随机工厂 (可能有扩展需求, 例如 来一个 保留随机位置 + 随机时刻出现敌人障碍物的工厂...)
public class RandomFactory implements Factory {
    private Random random = new Random();
    @Override
    public Enemy create(int screenWidth){
        Enemy enemy = null;
        if(random.nextBoolean()){
            enemy = new Airplane(random.nextInt(screenWidth), 0);//实例化飞机
        }else{
            enemy = new Tank(random.nextInt(screenWidth), 0);//实例化坦克
        }
        return enemy;
    }
}

in short 其实是工厂模式变种, 但是在创建一些对象时有些逻辑, 不好加在对象构造方法里面, 也不好使用简单工厂固定的创建 (例如, 根据产品族分类二级工厂)需求, 所以把它抽象出(二级'子类'工厂 )工厂方法

工厂方法模式总结

关键角色

  1. 产品
  2. 抽象产品工厂
  3. 具体产品工厂(多个可扩展)

工厂方法模式优缺点

工厂方法模式优点

  • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
  • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

工厂方法模式缺点

  • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

什么时候使用工厂方法模式

  • 需要使用很多重复代码创建对象时,比如,DAO 层的数据对象、API 层的 VO 对象等。
  • 创建对象要访问外部信息或资源时,比如,读取数据库字段,获取访问授权 token 信息,配置文件等。
  • 创建需要统一管理生命周期的对象时,比如,会话信息、用户网页浏览轨迹对象等。
  • 创建池化对象时,比如,连接池对象、线程池对象、日志对象等。这些对象的特性是:有限、可重用,使用工厂方法模式可以有效节约资源。
  • 希望隐藏对象的真实类型时,比如,不希望使用者知道对象的真实构造函数参数等。
posted @ 2025-11-19 22:04  daidaidaiyu  阅读(14)  评论(0)    收藏  举报