Java设计模式之工厂模式

一、简单工厂模式

1.为什么使用简单工厂模式

举个例子,汽车的种类有很多种,包括轿车、SUV、商务车、大巴车等等,但这些汽车种类同属于一个大类,所以客户只需要告诉汽车厂需要生产哪种汽车,即可生产出对应的汽车。

2.如何使用简单工厂模式

1.以上方汽车生产为例,我们先创建一个接口Car,该接口有produceCar()方法用于生产汽车,代码如下:

public interface Car {
    void produceCar();
}

2.再创建类SUVCar、VanCar、SedanCar、BusCar,用于表示各个种类的汽车,并实现Car接口:

/***********创建SUVCar***********/
public class SUVCar implements Car{
    @Override
    public void produceCar() {
        System.out.println("生产越野车");
    }
}
/***********创建VanCar***********/
public class VanCar implements Car{
    @Override
    public void produceCar() {
        System.out.println("生产商务车");
    }
}
/***********创建SedanCar***********/
public class SedanCar implements Car{
    @Override
    public void produceCar() {
        System.out.println("生产轿车");
    }
}
/***********创建BusCar***********/
public class BusCar implements Car{
    @Override
    public void produceCar() {
        System.out.println("生产巴士");
    }
}

3.最后创建工厂类CarFactory,声明一个静态方法createCar()用于创建具体的汽车对象,并传入carID,通过carID来选择具体要创建的汽车对象,代码如下:

public class CarFactory {
    /**
     * 创建Car 
     * @param carID
     * @return
     * @throws Exception
     */
    public static Car createCar(int carID) throws Exception {
        switch (carID){
            case 0:
                return new SedanCar();
            case 1:
                return new SUVCar();
            case 2:
                return new VanCar();
            case 3:
                return new BusCar();
            default:
                throw new Exception("输入车辆编号错误!");
        }
    }
}

4.简单工厂创建对象测试:

public class SimpleFactoryTest {
    public static void main(String[] args) {
        try {
            CarFactory.createCar(2).produceCar();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测试打印如下:

生产商务车

二、抽象工厂模式

1.为什么使用抽象工厂模式

仍以上方汽车生产为例,上文说过,汽车的种类有很多种,包括轿车、SUV、商务车、大巴车等等,但这么多种汽车不可能都放到一个厂里面去进行生产,现实中一个汽车厂商一般都会有针对不同车型的分厂,这样更有利于厂商内部进行管理。如此一来,整个流程就变成:客户下单->经销商联系汽车总厂商->总厂商根据车型分派给相应的分厂->分厂生产->客户提车。 此时,如果以简单工厂模式实现上面流程,就比较力不从心了,处理起来比较复杂和麻烦

2.如何使用抽象工厂模式

1.首先创建一个工厂接口ICarFactory,声明方法getCarProduce(),用于返回汽车对象的接口IProduceCar:

public interface ICarFactory {
    IProduceCar getCarProduce(String carNum);
}

后面的抽象工厂类和具体工厂类都需要实现这个接口,用于返回工厂对象。
2.创建汽车对象的接口IProduceCar

public interface IProduceCar {
    void productCar();
}

该接口用于生成汽车对象的一些操作方法。
3.创建具体工厂类SUVCarFactory、VANCarFactory:

/***********创建SUVCarFactory***********/
public class SUVCarFactory implements ICarFactory {
    @Override
    public IProduceCar getCarProduce(String carNum) {
        return new SUVCar();
    }
}
/***********创建VANCarFactory***********/
public class VANCarFactory implements ICarFactory {

    @Override
    public IProduceCar getCarProduce(String carNum) {
        return new VANCar();
    }
}

实现ICarFactory 接口,并在接口实现方法中返回具体汽车对象。
4.创建具体汽车对象类SUVCar、VANCar:

/***********创建SUVCar***********/
public class SUVCar implements IProduceCar {
    @Override
    public void productCar() {
        System.out.println("生产越野车");
    }
}
/***********创建VANCar***********/
public class VANCar implements IProduceCar {

    @Override
    public void productCar() {
        System.out.println("生产商务车");
    }
}

实现汽车对象接口
5.创建汽车总工厂类,该工厂即为抽象工厂类:

public class BaseCarFactory implements ICarFactory {

    @Override
    public IProduceCar getCarProduce(String carNum) {
        ICarFactory carFactory=null;
        if (carNum.contains("suv")){
            //构建SUV工厂对象 准备在SUV工厂生产
            carFactory=new SUVCarFactory();
        }else if (carNum.contains("van")){
            //构建Van工厂对象 准备在Van工厂生产
            carFactory=new VANCarFactory();
        }

        if (carFactory!=null){
            IProduceCar car=carFactory.getCarProduce(carNum);
            return car;
        }
        return null;
    }
}

该类实现了工厂接口ICarFactory ,并在其实现方法中,根据传入的carNum,创建对应的汽车工厂,最后根据创建的汽车工厂,返回汽车实体对象接口。
6.抽象工厂创建对象测试:

public class AbstractFactoryTest {
    public static void main(String[] args) {
        BaseCarFactory carFactory=new BaseCarFactory();
        carFactory.getCarProduce("van002").productCar();
    }
}

测试打印如下:

生产商务车

注:该博文仅用于记录自己的理解,有误的地方还请各位看官多多包涵指出,大家一起学习进步!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值