工厂方法模式

2019-11-08  本文已影响0人  FredWhite

定义

【创建型】定义一个用于创建对象的接口,让子类去决定具体实例化哪个类。

使用场景

在任何需要生成复杂对象的地方,都可以使用工厂模式。

用 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);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读