抽象工厂模式

时间:2019-04-20
本文章向大家介绍抽象工厂模式,主要包括抽象工厂模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1:实例
某客户想要购买一辆车,他要联系4S店,首先得有4S店(抽象工厂)的电话。

客户上网查询(建造工厂),发现了宝马4S店(具体工厂)的电话和奔驰4S店(具体工厂)的电话。

客户拨通了宝马4S店的电话(获取具体工厂),发现目前店里可以提供(生产)多款车型(具体产品)供
客户选择(BMW 320、BMW 530,BMW 740)。

客户拨通了奔驰4S店的电话(获取具体工厂),发现目前店里可以提供(生产)多款车型(具体产品)供
客户选择(BenzC200、BenzE300)。
代码实现:
1:车的最高级抽象
package AbstractFactory;

/**
 * 作用:最高级抽象产品,用于抽象工厂的建造方法的返回值
 */
public abstract class Car {
    abstract void drive();
}

2:宝马车的抽象和实现

package AbstractFactory;

/**
 * 作用:宝马产品的产品类
 */
public abstract class BMWCar extends Car{
}

//宝马BMW320的具体实现
class BMW320 extends BMWCar{

    @Override
    void drive() {
        System.out.println("BMW320,老板专用。");
    }
}

//宝马BMW530的具体实现
class BMW530 extends BMWCar {
    public void drive()
    {
        System.out.println("BMW530,时不我待。");
    }
}

3:奔驰车的抽象和实现

package AbstractFactory;

/**
 * 作用:奔驰汽车的产品类
 */
public abstract class BenzCar extends Car {
}

//奔驰C200的具体实现
class BenzC200 extends BenzCar {
    public void drive()
    {
        System.out.println("BenzC200,实惠有面");
    }
}

//奔驰E300的具体实现
class BenzE300 extends BenzCar {
    public void drive()
    {
        System.out.println("BenzE300,商务气派");
    }
}

4:抽象工厂,宝马工厂和奔驰车厂来实现它

package AbstractFactory;

/**
 * 作用:抽象工厂类
 */
public abstract class AbstractFactory {
    public abstract Car getCar(String type) throws ClassNotFoundException,
            IllegalAccessException, InstantiationException;
}

//宝马工厂,生产所有的宝马类型
class BMWFactory extends AbstractFactory{

    @Override
    public Car getCar(String type) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class<?> aClass = Class.forName(type);
        return (BMWCar) aClass.newInstance();
    }
}

//奔驰工厂,生产所有的奔驰
class BenzFactory extends AbstractFactory{

    @Override
    public Car getCar(String type) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class<?> aClass = Class.forName(type);
        return (BenzCar) aClass.newInstance();
    }
}

5:超级工厂,建造工厂的工厂

package AbstractFactory;

/**
 * 作用:超级工厂类,建造工厂的工厂
 */
public  class FactoryProducer {
    public static AbstractFactory getFactory(String type)
            throws IllegalAccessException, InstantiationException, ClassNotFoundException
    {
        Class cl = Class.forName(type);
        System.out.println("创建工厂:"+type);
        return (AbstractFactory)cl.newInstance();
    }
}

6:测试

package AbstractFactory;

/**
 * 作用:
 */
public class Demo {
    public static void main(String[] args) throws Exception{
        //超级工厂去创建生产宝马的工厂
        AbstractFactory bmwFactory = FactoryProducer.getFactory("AbstractFactory.BMWFactory");
        //宝马工厂去生产具体的宝马类型
        bmwFactory.getCar("AbstractFactory.BMW320").drive();

        //超级工厂去创建生产宝马的工厂
        AbstractFactory benzFactory = FactoryProducer.getFactory("AbstractFactory.BenzFactory");
        //宝马工厂去生产具体的宝马类型
        benzFactory.getCar("AbstractFactory.BenzC200").drive();
    }
}