定义
【创建型】定义一个用于创建对象的接口,让子类去决定具体实例化哪个类。
使用场景
在任何需要生成复杂对象的地方,都可以使用工厂模式。
用 new 就可以创建的对象,不需要使用工厂模式。
实现方式
背景:奔驰工厂准备建奔驰 A级、C级、E级
解决方案:采用工厂方法模式。
Product(抽象类)
// 奔驰车抽象类
public abstract class BenzCar {
// 行驶
public abstract void drive();
// 自启动
public abstract void autoStart();
// 是否打开天窗
public abstract void openSkylight(boolean isOpen);
}
Product(实现类)
奔驰A级
public class BenzA extends BenzCar {
@Override
public void drive() {
System.out.println("奔驰A级开车");
}
@Override
public void autoStart() {
System.out.println("奔驰A级自启动");
}
@Override
public void openSkylight(boolen isOpen) {
String result = isOpen ? "打开天窗" : "关闭天窗";
System.out.println("奔驰A级" + result);
}
}
奔驰C级
public class BenzC extends BenzCar {
@Override
public void drive() {
System.out.println("奔驰C级开车");
}
@Override
public void autoStart() {
System.out.println("奔驰C级自启动");
}
@Override
public void openSkylight(boolen isOpen) {
String result = isOpen ? "打开天窗" : "关闭天窗";
System.out.println("奔驰C级" + result);
}
}
奔驰E级
public class BenzE extends BenzCar {
@Override
public void drive() {
System.out.println("奔驰E级开车");
}
@Override
public void autoStart() {
System.out.println("奔驰E级自启动");
}
@Override
public void openSkylight(boolen isOpen) {
String result = isOpen ? "打开天窗" : "关闭天窗";
System.out.println("奔驰E级" + result);
}
}
Factory(抽象类)
public abstract class BenzFactory {
public abstract <T extends BenzCar> T createBenzCar(Class<T> clz);
}
Factory(实现类)
// 一个 Factory 实现类实现多个产品(相近的产品只需要一个产品线)
public class BenzCarFactory extends BenzFactory {
public <T extends BenzCar> T createBenzCar(Class<T> clz) {
BenzCar car = null;
// 利用反射获取具体实例
try {
car = (BenzCar) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return car;
}
}
测试
public class TestFactory {
public static void main(String[] args) {
// 构造工厂对象
BenzFactory factory = new BenzCarFactory();
// 生产产品
BenzA benzA = factory.createBenzCar(BenzA.class);
benzA.autoStart();
benzA.drive();
benzA.openSkylight(false);
BenzC benzC = factory.createBenzCar(BenzC.class);
benzC.autoStart();
benzC.drive();
benzC.openSkylight(true);
BenzE benzE = factory.createBenzCar(BenzE.class);
benzE.autoStart();
benzE.drive();
benzE.openSkylight(true);
}
}
网友评论