1. 程式人生 > 實用技巧 >設計模式-抽象工廠模式

設計模式-抽象工廠模式

抽象工廠模式相對於簡單工廠模式,會複雜一些,但是擴充套件性變得更加好;

一、實現抽象工廠一共分一下幾個步驟:

  • 建立產品介面
  • 建立產品抽象類
  • 建立產品具體實現類
  • 建立工廠介面
  • 建立抽象工廠
  • 建立具體工廠實現類
  • 創造者呼叫創造方法

下面是簡單的類圖:

產品類圖:

工廠類圖:

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();

    }
}

到這裡抽象工廠的設計模式就講完了,如果有不足,請指出,共同探討。