对对象构造、实例化、初始化过程的封装。
1.简单工厂模式
1.1 概念
- 专门定义一个类用来创建其它类的实例,被创建的实例通常都具有共同的父亲。
1.2 设计思路
-
创建一个抽象父类。
package factory; /** * @author huangdq * @version 1.0.0 * @ClassName Enemy.java * @Description 敌机 父类 * @createTime 2022年04月13日 09:39:00 */ public abstract class Enemy { /** * 纵坐标 */ protected int x; /** * 横坐标 */ protected int y; /** * 初始化坐标 * * @param x 纵坐标 * @param y 横坐标 */ public Enemy(int x, int y){ this.x = x; this.y = y; } /** * 抽象方法,在地图上绘制 */ public abstract void show(); }
-
创建具体对象类,并继承抽象父类
package factory; /** * @author huangdq * @version 1.0.0 * @ClassName AirPlane.java * @Description 敌机类 * @createTime 2022年04月13日 09:57:00 */ public class AirPlane extends Enemy{ public AirPlane(int x, int y){ // 调用父类构造方法初始化坐标 super(x, y); } @Override public void show() { System.out.println("飞机出现在坐标:" + x + "," + y); } }
package factory; /** * @author huangdq * @version 1.0.0 * @ClassName Tank.java * @Description 坦克类 * @createTime 2022年04月13日 10:01:00 */ public class Tank extends Enemy{ public Tank(int x, int y){ super(x, y); } @Override public void show() { System.out.println("坦克出现在坐标:" + x + "," + y); } }
-
创建简单工厂类,通过类型来实例化对象
package factory; import java.util.Random; /** * @author huangdq * @version 1.0.0 * @ClassName SimpleFactory.java * @Description 简单工厂模式 * @createTime 2022年04月13日 10:12:00 */ public class SimpleFactory { private int screenWidth; private Random random; public SimpleFactory(int screenWidth){ this.screenWidth = screenWidth; this.random = new Random(); } public Enemy create(String type){ int x = random.nextInt(screenWidth); Enemy enemy = null; switch (type){ case "Airplane": enemy = new AirPlane(x, 0); break; case "Tank": enemy = new Tank(x, 0); break; } return enemy; } }
1.3 问题
- 通过代码我们发现,简单工厂模式并没有我们想象的“简单”,会随着我们需求的变化,不仅对象需要改变,简单工厂模式也需要更着变动。
2. 工厂模式
- 将简单工厂模式的制造方法拆分,构建起抽象化,多态化的生产模式。
2.1 设计思路
-
创建一个标准化的工厂接口
package standardFactory; /** * @author huangdq * @version 1.0.0 * @ClassName Factory.java * @Description 工厂接口 * @createTime 2022年04月13日 11:14:00 */ public interface Factory { /** * 声明工厂制造标准 * * @param screenWidth 屏幕宽度 * @return */ Enemy create(int screenWidth); }
-
创建一个抽象父类。
package standardFactory; /** * @author huangdq * @version 1.0.0 * @ClassName Enemy.java * @Description 敌机 父类 * @createTime 2022年04月13日 09:39:00 */ public abstract class Enemy { /** * 纵坐标 */ protected int x; /** * 横坐标 */ protected int y; /** * 初始化坐标 * * @param x 纵坐标 * @param y 横坐标 */ public Enemy(int x, int y){ this.x = x; this.y = y; } /** * 抽象方法,在地图上绘制 */ public abstract void show(); }
-
创建产品对象
package standardFactory; /** * @author huangdq * @version 1.0.0 * @ClassName AirPlane.java * @Description 敌机类 * @createTime 2022年04月13日 09:57:00 */ public class AirPlane extends Enemy { public AirPlane(int x, int y){ // 调用父类构造方法初始化坐标 super(x, y); } @Override public void show() { System.out.println("飞机出现在坐标:" + x + "," + y); } }
package standardFactory; /** * @author huangdq * @version 1.0.0 * @ClassName Tank.java * @Description 坦克类 * @createTime 2022年04月13日 10:01:00 */ public class Tank extends Enemy { public Tank(int x, int y){ super(x, y); } @Override public void show() { System.out.println("坦克出现在坐标:" + x + "," + y); } }
-
创建产品工具类
package standardFactory; import java.util.Random; /** * @author huangdq * @version 1.0.0 * @ClassName AirplaneFactory.java * @Description 飞机工厂类 * @createTime 2022年04月13日 11:16:00 */ public class AirplaneFactory implements Factory{ @Override public Enemy create(int screenWidth) { Random random = new Random(); return new AirPlane(random.nextInt(screenWidth), 0); } }
package standardFactory; import java.util.Random; /** * @author huangdq * @version 1.0.0 * @ClassName TankFactory.java * @Description 坦克工厂类 * @createTime 2022年04月13日 13:34:00 */ public class TankFactory implements Factory{ @Override public Enemy create(int screenWidth) { Random random = new Random(); return new Tank(random.nextInt(screenWidth), 0); } }
-
客户端
package standardFactory; /** * @author huangdq * @version 1.0.0 * @ClassName Client.java * @Description 客户端 * @createTime 2022年04月13日 13:41:00 */ public class Client { public static void main(String[] args) { int screenWidth = 100; System.out.println("游戏开始......"); Factory factory = new TankFactory(); for (int i = 0; i < 10; i++) { factory.create(screenWidth).show(); } factory = new AirplaneFactory(); for (int i = 0; i < 5; i++) { factory.create(screenWidth).show(); } System.out.println("最后关卡"); factory = new BossFactory(); factory.create(screenWidth).show(); } }