设计模式-抽象工厂模式

抽象工厂模式相对于简单工厂模式,会复杂一些,但是扩展性变得更加好;

一、实现抽象工厂一共分一下几个步骤:

  • 创建产品接口
  • 创建产品抽象类
  • 创建产品具体实现类
  • 创建工厂接口
  • 创建抽象工厂
  • 创建具体工厂实现类
  • 创造者调用创造方法

下面是简单的类图:

 

产品类图:

 

 工厂类图:

 

1、创建产品接口

package com.dongl.abstractfactory;

/**
 * 交通工具接口
 * 定义了交通工具可以行驶  可以停止
 */
public interface Vehicle {

    //行驶
    public void go();

    //停止
    public void stop();

    //定义性别
    public void color();
}

 

2、创建产品抽象类

小汽车

package com.dongl.abstractfactory;

public abstract class AbstractCar implements Vehicle {

    public void go() {
        System.out.println("小汽车行驶 di di di -------------");
    }


    public void stop() {
        System.out.println("小汽车停下来 ---------------");
    }
}

公交车:

package com.dongl.abstractfactory;

public abstract class AbstractBus implements Vehicle{

    public void go() {
        System.out.println("公交车行驶 wuwuwu ------------");
    }


    public void stop() {
        System.out.println("公交车停止 -------------");
    }
}

飞机:

package com.dongl.abstractfactory;

public abstract class AbstractPlane implements Vehicle {

    public void go() {
        System.out.println("飞机起飞 sou sou sou ---------");
    }

    public void stop() {
        System.out.println("飞机停下来 ----------------");
    }
}

 

3、创建产品具体实现类

红色小汽车:

package com.dongl.abstractfactory;

public class CarRed extends AbstractCar {

    public void color(){
        System.out.println("该小汽车颜色为红色");
    }
}

黑色小汽车:

package com.dongl.abstractfactory;

public class CarBlack extends AbstractCar {

    public void color(){
        System.out.println("该小汽车颜色为黑色");
    }
}

红色公交车:

package com.dongl.abstractfactory;

public class BusRed extends AbstractBus{
    public void color(){
        System.out.println("该公交车颜色为红色");
    }
}

黑色公交车:

package com.dongl.abstractfactory;

public class BusBlack extends AbstractBus{
    public void color(){
        System.out.println("该公交车颜色为黑色");
    }
}

 

红色飞机:

package com.dongl.abstractfactory;

public class PlaneRed extends AbstractPlane {
    public void color(){
        System.out.println("该飞机颜色为红色");
    }
}

 

黑色飞机:

package com.dongl.abstractfactory;

public class PlaneBlack extends AbstractPlane {

    public void color(){
        System.out.println("该飞机颜色为黑色");
    }
}

 

4、创建工厂接口

package com.dongl.abstractfactory;

/**
 * 交通工具抽象类
 * 定义制造方法
 */
public interface VehicleFactory {
    //造小汽车
    public Vehicle createCar();
    //造公交
    public Vehicle createBus();
    //造飞机
    public Vehicle createPlane();
}

 

5、创建抽象工厂

package com.dongl.abstractfactory;

/**
 * 创建对象实例
 */
public abstract class AbstractVehicleFactory implements VehicleFactory {

    protected Vehicle createVehicle(VehicleEnum vehicleEnum){
        Vehicle vehicle = null;

        //如果制造的交通工具存在 创建对象实例
        if(!vehicleEnum.getValue().equals("")) {
            try {
                vehicle = (Vehicle) Class.forName(vehicleEnum.getValue()).newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return vehicle;
    }
}

 

6、创建具体工厂实现类

红色交通工具工厂:

package com.dongl.abstractfactory;

public class RedVehicleFactory extends AbstractVehicleFactory {

    @Override
    public Vehicle createCar() {
        return super.createVehicle(VehicleEnum.CarRed);
    }

    @Override
    public Vehicle createBus() {
        return super.createVehicle(VehicleEnum.BusRed);
    }

    @Override
    public Vehicle createPlane() {
        return super.createVehicle(VehicleEnum.PlaneRed);
    }
}

黑色建通工具工厂:

package com.dongl.abstractfactory;

public class BlackVehicleFactory extends AbstractVehicleFactory {

    @Override
    public Vehicle createCar() {
        return super.createVehicle(VehicleEnum.CarBlack);
    }

    @Override
    public Vehicle createBus() {
        return super.createVehicle(VehicleEnum.BusBlack);
    }

    @Override
    public Vehicle createPlane() {
        return super.createVehicle(VehicleEnum.PlaneBlack);
    }
}

 

7、创造者调用创造方法

package com.dongl.abstractfactory;

public class Creator {

    public static void main(String[] args) {
        /**这里可以使用两个工厂进行生产交通工具  也就是所谓的两条生产线*/
        //第一条生产线 RedVehicleFactory 生产红色交通工具
        RedVehicleFactory redVehicleFactory = new RedVehicleFactory();

        //第二条生产线 BlackVehicleFactory 生产黑色交通工具
        VehicleFactory blackVehicleFactory = new BlackVehicleFactory();

        //红色生产线生产一辆小汽车
        Vehicle car = redVehicleFactory.createCar();
        car.go();  car.stop(); car.color();

        //黑色生产线生产一辆公交车
        Vehicle bus = blackVehicleFactory.createBus();
        bus.go(); bus.stop(); bus.color();

    }
}

到这里抽象工厂的设计模式就讲完了,如果有不足,请指出,共同探讨。

 

posted @ 2020-07-15 14:08  AmourLee  阅读(138)  评论(0编辑  收藏  举报