【设计模式系列】3.工厂模式

目录

一、简单工厂模式

二、工厂方法模式

三、抽象工厂模式


一、简单工厂模式

核心思想:有一个专门的类来生产其他类的实例,生产的这些实例有一个共同父类。

举例:假如有一个汽车工厂,它既可以生产宝马汽车,也可以生产奥迪汽车。

【设计模式系列】3.工厂模式

代码实现

// 汽车工厂,有生产汽车的方法
public class CarFactory {
    public Car creatCar(int num) {
        return num % 2 == 0 ? new BMWCar() : new AudiCar();
    }
}
// 汽车接口(获取汽车的生产信息)
public interface Car {
     String getCarMode();
}
// 生产宝马汽车
public class BMWCar implements Car{
    @Override
    public String getCarMode() {
        return "华晨宝马 X5";
    }
}
// 生产宝马汽车
public class AudiCar implements Car{
    @Override
    public String getCarMode() {
        return "奥迪 A6L旗舰版";
    }
}

测试

@Test
void test() {
    Car car = new CarFactory().creatCar(0);
    logger.info(car.getCarMode());
}

二、工厂方法模式

核心思想:定义一个专门生产其他类实例的接口,让子类决定具体生产哪个类的实例。工厂方法模式其实是在简单工厂上面做了一些增强。

举例:有一个汽车工厂,它有两个子工厂,分别负责生产各自品牌的汽车。

【设计模式系列】3.工厂模式

代码实现

// 汽车工厂接口
public interface CarFactory {
    Car creatCar();
}
// 生产宝马汽车的工厂
public class BMWCarFactory implements CarFactory{
    @Override
    public Car creatCar() {
        return new BMWCar();
    }
}
// 生产奥迪汽车的工厂
public class AudiCarFactory implements CarFactory{
    @Override
    public Car creatCar() {
        return new AudiCar();
    }
}
// 汽车接口(获取汽车的生产信息),代码与简单工厂相同
// 生产宝马汽车,代码与简单工厂相同
// 生产宝马汽车,代码与简单工厂相同

测试:

@Test
void test() {
    // 通过不同的工厂来获取不同实例
    Car bmwCar =new BMWCarFactory().creatCar();
    logger.info( bmwCar.getCarMode());

    Car audiCar =new AudiCarFactory().creatCar();
    logger.info( audiCar.getCarMode());
} 

三、抽象工厂模式

核心思想:是一种存在产品系的工厂模式,很容易在特定工厂下扩展产品种类。

举例:有一个工厂,它有多个子工厂,各个子工厂可以生产不同种类的产品。

【设计模式系列】3.工厂模式

代码实现

// 统一的工厂接口
public interface Factory {
    Car createCar();
    Ship createShip();
}
// BMW工厂
public class BMWFactory implements Factory{
    @Override
    public Car createCar() {
        return new BMWCar();
    }

    @Override
    public Ship createShip() {
        return new BMWShip();
    }
}
// Audi工厂
public class AudiFactory implements Factory{
    @Override
    public Car createCar() {
        return new AudiCar();
    }

    @Override
    public Ship createShip() {
        return new AudiShip();
    }
}

// 汽车接口(获取轮船的生产信息),代码与简单工厂相同
// 宝马汽车产品,代码与简单工厂相同
// 奥迪汽车产品,代码与简单工厂相同

// 轮船接口(获取轮船的生产信息)
public interface Ship {
    String getShipMode();
}
// 宝马轮船产品
public class BMWShip implements Ship{
    @Override
    public String getShipMode() {
        return "宝马 造轮船了~";
    }
}
// 奥迪的轮船产品
public class AudiShip implements Ship{
    @Override
    public String getShipMode() {
        return "奥迪 造轮船了~";
    }
}

测试:

@Test
void test() {
    // 宝马工厂生产汽车和轮船
    logger.info(new BMWFactory().createCar().getCarMode());
    logger.info(new BMWFactory().createShip().getShipMode());
    
    // 奥迪工厂生产汽车和轮船
    logger.info(new AudiFactory().createCar().getCarMode());
    logger.info(new AudiFactory().createShip().getShipMode());

小结:

(1)增加xx工厂:创建xx工厂,继承工厂接口,然后创建xx汽车继承汽车接口,创建xx轮船继承轮船接口即可。

(2)增加飞机产品:首先创建飞机接口,然后分别创建BMW飞机和Audi飞机实现类实现飞机接口。然后再工厂接口中增加创建飞机的方法,在BMW工厂和Audi工厂分别实现自家飞机的创建。

上一篇:CS:APP Chapter 1 计算机系统漫游


下一篇:强化学习导论 课后习题参考 - Chapter 5,6